diff --git a/.gitignore b/.gitignore index a6eb98a..90dad5b 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,3 @@ Version.h # install dir install *.xraw -ref diff --git a/main.cpp b/main.cpp index 18b960c..cfd6969 100644 --- a/main.cpp +++ b/main.cpp @@ -94,8 +94,7 @@ int main(int, char**) cv::Mat mat_pan;//全景显示 //return 0; FILE* file = fopen("../20241219152917_4.xraw","rb"); - - + for (size_t i = 0; i < 900; i++) { diff --git a/ref/AutoStitching/README.md b/ref/AutoStitching/README.md new file mode 100644 index 0000000..a568a8b --- /dev/null +++ b/ref/AutoStitching/README.md @@ -0,0 +1,56 @@ +## Introduction + +This project is a generic framework for globally consistent alignment of images captured from approximately planar +scenes via topology analysis. Specifically, it can resist the perspective distortion meanwhile preserving the local +alignment accuracy. To guanrantee the alignment accuracy, global topological relations of images are searched firstly, +and then a global optimization on alignment parameters are performed. + +This C++ implemented algorithm is described in +"[Globally Consistent Alignment for Planar Mosaicking via Topology Analysis](http://menghanxia.github.io/papers/2017_Planar_Alignment_pr.pdf)", Pattern Recognition (PR), Jan. 2017. +Notice: This program is free for personal, non-profit and academic use. +All right reserved to CVRS: http://cvrs.whu.edu.cn/. +If you have any question, please contact: menghanxyz@gmail.com (Menghan Xia) + +Here is an example for demonstration below (image topological graph and alignment result): + + + +## Usage +### Dependent Libarary [compulsory]: +OpenCV 2.4.9 is recommended. + +### 1. Project Configure: +This procedure is developed on *Visual Studio 2010* under *Windows 8.1* system environment, +where the source code is organized with CMakeLists. So, before opening it in Visual Studio, +you need to configure the project with *CMake*. + +### 2. Running and Test: +2.1 Default folders in "*data*": +- "*Images*" : put your source images in it. +- "*Cache*" (optional) : used to store those intermediate results (feature points files, matching point files, topological matrix, etc) that +are required by the final alignmnet optimization. + +2.2 Running parameter settings: +- Set your reference image for alignment: 【Variable '*refNo*'】 [line 16] in [main.cpp](./source/Src/Mosaic/main.cpp). +e.g. refNo=-1 means that the program will automatically selects a reference via topological analysis. +- Set whether your image set is sequential order or not: 【Variable '*isSeqData*'】 [line 38] in [main.cpp](./source/Src/Mosaic/main.cpp) +- Set whether the image keypoints available in [*Cache*](./data/Cache): 【Variable '*loadKeyPts*'】 [line 39] in [main.cpp](./source/Src/Mosaic/main.cpp) +- Set whether the inter-image overlap relations available in [*Cache*](./data/Cache): 【Variable '*loadTopology*'】 [line 40] in [main.cpp](./source/Src/Mosaic/main.cpp) + +Besides, to use our preset working directory successfully, do not forget to UPDATE the path variable +'*baseDir*' as **the absolute path** of your directory "*data*" in the source file [source/Src/Utils/util.h](./source/Src/Utils/util.h) [line 16] + +So far, you can run the procedure and check the alignment/stitching results now. + +## Citation +If any part of our paper and code is helpful to your work, please generously cite with: +``` +@article{DBLP:journals/pr/XiaYXLZ17, + author = {Menghan Xia and Jian Yao and Renping Xie and Li Li and Wei Zhang}, + title = {Globally consistent alignment for planar mosaicking via topology analysis}, + journal = {Pattern Recognit.}, + volume = {66}, + pages = {239--252}, + year = {2017} +} +``` diff --git a/ref/AutoStitching/data/Cache/imgSizeList.txt b/ref/AutoStitching/data/Cache/imgSizeList.txt new file mode 100644 index 0000000..bd04d70 --- /dev/null +++ b/ref/AutoStitching/data/Cache/imgSizeList.txt @@ -0,0 +1,61 @@ +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 +1500 1001 diff --git a/ref/AutoStitching/data/Cache/keyPtfile/keyPts b/ref/AutoStitching/data/Cache/keyPtfile/keyPts new file mode 100644 index 0000000..2b7779b --- /dev/null +++ b/ref/AutoStitching/data/Cache/keyPtfile/keyPts @@ -0,0 +1 @@ +surf feature points \ No newline at end of file diff --git a/ref/AutoStitching/data/Cache/matchPtfile/match_01&02.txt b/ref/AutoStitching/data/Cache/matchPtfile/match_01&02.txt new file mode 100644 index 0000000..3feb0af --- /dev/null +++ b/ref/AutoStitching/data/Cache/matchPtfile/match_01&02.txt @@ -0,0 +1,2 @@ +matched surf features +x1 y1 x2 y2 \ No newline at end of file diff --git a/ref/AutoStitching/data/Cache/similarityMat.txt b/ref/AutoStitching/data/Cache/similarityMat.txt new file mode 100644 index 0000000..a5ba9c6 --- /dev/null +++ b/ref/AutoStitching/data/Cache/similarityMat.txt @@ -0,0 +1,61 @@ + 0 710 373 73 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 60 83 52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 710 0 961 267 59 17 0 0 0 0 0 0 0 0 0 0 0 0 0 15 25 64 69 54 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 373 961 0 537 138 38 0 0 0 0 0 0 0 0 0 0 0 0 0 25 50 66 67 72 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 73 267 537 0 487 102 28 0 0 0 0 0 0 0 0 0 12 0 23 53 45 57 45 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 22 59 138 487 0 526 177 51 28 0 0 0 0 0 0 0 13 19 29 48 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 17 38 102 526 0 706 187 92 37 0 0 0 0 0 16 19 33 48 52 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 28 177 706 0 576 190 68 0 0 0 0 14 23 30 29 37 33 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 51 187 576 0 787 157 54 25 19 28 25 33 22 41 43 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 28 92 190 787 0 754 143 48 22 29 27 30 20 23 32 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 37 68 157 754 0 711 134 39 33 38 36 16 12 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 54 143 711 0 759 43 36 28 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 25 48 134 759 0 32 34 36 35 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 19 22 39 43 32 0 1178 364 189 48 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 67 83 85 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 28 29 33 36 34 1178 0 903 389 90 48 15 0 0 0 0 0 0 0 0 0 0 0 0 22 58 91 101 98 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 14 25 27 38 28 36 364 903 0 1152 305 94 59 10 0 0 0 0 0 0 0 0 0 0 0 30 77 111 101 95 70 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 16 23 33 30 36 31 35 189 389 1152 0 668 296 116 45 0 0 0 0 0 0 0 0 0 0 0 57 109 154 108 103 83 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 12 13 19 30 22 20 16 0 0 48 90 305 668 0 825 275 110 31 0 0 0 0 0 0 0 0 12 14 43 63 60 47 42 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 19 33 29 41 23 12 0 0 0 48 94 296 825 0 975 298 81 0 0 0 0 0 0 12 13 15 20 63 51 49 26 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 23 29 48 37 43 32 14 0 0 0 15 59 116 275 975 0 1018 232 44 0 0 0 0 19 18 26 39 44 51 54 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 15 25 53 48 52 33 15 10 0 0 0 0 0 10 45 110 298 1018 0 742 131 57 0 0 0 31 29 30 37 47 37 26 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 25 50 45 25 20 18 0 0 0 0 0 0 0 0 0 31 81 232 742 0 813 304 137 0 25 53 40 42 37 37 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 38 64 66 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 131 813 0 712 225 116 42 53 55 31 19 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 60 69 67 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 304 712 0 745 273 51 69 53 29 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 83 54 72 60 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 137 225 745 0 1118 50 58 52 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 52 46 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 273 1118 0 32 27 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 42 51 50 32 0 713 262 48 16 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 46 57 49 16 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 31 53 53 69 58 27 713 0 707 142 59 30 0 0 0 0 0 0 0 0 0 0 0 0 0 11 17 31 36 25 28 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 18 29 40 55 53 52 16 262 707 0 692 171 80 30 12 0 0 0 0 0 0 0 0 0 0 13 16 27 31 22 30 23 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 26 30 42 31 29 23 0 48 142 692 0 859 209 92 40 0 0 0 0 0 0 0 0 0 20 17 31 31 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 15 39 37 37 19 16 0 0 16 59 171 859 0 676 219 59 15 0 0 0 0 0 0 0 13 26 26 39 33 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 20 44 47 37 23 0 0 0 18 30 80 209 676 0 714 156 65 0 0 0 0 0 0 16 26 37 32 40 29 18 10 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 22 30 57 43 63 51 37 18 0 0 0 0 0 0 30 92 219 714 0 959 262 70 26 0 0 0 0 29 38 45 41 29 29 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 35 58 77 109 63 51 54 26 0 0 0 0 0 0 0 12 40 59 156 959 0 965 242 118 41 10 10 21 53 36 25 24 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 67 91 111 154 60 49 44 14 0 0 0 0 0 0 0 0 0 15 65 262 965 0 729 300 147 0 22 27 49 46 32 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 83 101 101 108 47 26 0 0 0 0 0 0 0 0 0 0 0 0 0 70 242 729 0 867 244 0 0 0 21 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 85 98 95 103 42 10 0 0 0 0 0 0 0 0 0 0 0 0 0 26 118 300 867 0 714 14 0 17 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 68 74 70 83 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 147 244 714 0 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 14 17 0 941 269 57 29 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 24 31 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 22 0 0 0 941 0 1061 194 72 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 27 39 40 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 27 0 17 0 269 1061 0 632 161 116 15 0 0 0 0 0 0 0 0 0 0 0 0 17 24 32 38 33 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 29 53 49 21 13 0 57 194 632 0 951 285 79 16 0 0 0 0 0 0 0 0 0 0 14 26 44 38 41 16 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 26 38 36 46 25 10 0 29 72 161 951 0 890 156 36 24 0 0 0 0 0 0 0 0 0 15 34 38 32 30 12 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 26 37 45 25 32 0 0 0 23 32 116 285 890 0 669 163 82 15 0 0 0 0 0 0 17 10 13 31 34 28 18 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 17 26 32 41 24 13 0 0 0 0 0 15 79 156 669 0 772 186 48 0 0 0 0 0 13 24 27 25 13 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 16 31 39 40 29 17 0 0 0 0 0 0 0 16 36 163 772 0 707 194 35 0 0 0 12 13 33 29 15 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 27 31 33 29 29 0 0 0 0 0 0 0 0 0 24 82 186 707 0 700 147 54 0 21 22 19 22 25 11 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 31 31 23 14 18 11 0 0 0 0 0 0 0 0 0 0 15 48 194 700 0 786 263 106 28 34 41 26 12 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 36 22 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 35 147 786 0 1069 454 42 53 44 18 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 25 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 263 1069 0 1211 47 46 30 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 28 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 106 454 1211 0 49 29 13 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 28 42 47 49 0 1075 252 105 11 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 22 34 53 46 29 1075 0 1094 248 41 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 13 19 41 44 30 13 252 1094 0 706 109 30 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 24 33 22 26 18 0 0 105 248 706 0 654 114 82 19 0 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 27 29 25 12 0 0 0 11 41 109 654 0 659 266 91 14 0 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 15 13 25 15 11 0 0 0 0 0 0 30 114 659 0 934 271 71 12 0 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 26 34 31 13 0 0 0 0 0 0 0 0 0 82 266 934 0 1013 225 61 18 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 24 44 38 34 0 0 0 0 0 0 0 0 0 0 19 91 271 1013 0 866 232 54 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 27 32 38 32 28 0 0 0 0 0 0 0 0 0 0 0 14 71 225 866 0 699 234 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 39 38 41 30 18 0 0 0 0 0 0 0 0 0 0 0 0 12 61 232 699 0 978 + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 40 33 16 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 54 234 978 0 diff --git a/ref/AutoStitching/data/Images/niuniu.png b/ref/AutoStitching/data/Images/niuniu.png new file mode 100644 index 0000000..901c4c7 Binary files /dev/null and b/ref/AutoStitching/data/Images/niuniu.png differ diff --git a/ref/AutoStitching/docs/demo.png b/ref/AutoStitching/docs/demo.png new file mode 100644 index 0000000..41920a4 Binary files /dev/null and b/ref/AutoStitching/docs/demo.png differ diff --git a/ref/AutoStitching/source/CMakeLists.txt b/ref/AutoStitching/source/CMakeLists.txt new file mode 100644 index 0000000..88f629b --- /dev/null +++ b/ref/AutoStitching/source/CMakeLists.txt @@ -0,0 +1,89 @@ +PROJECT(AutoMosaic) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3) + +SET(CMAKE_COLOR_MAKEFILE ON) +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) + +# Allow advanced users to generate Makefiles printing detailed commands +MARK_AS_ADVANCED(CMAKE_VERBOSE_MAKEFILE) + +# Path to additional CMake modules +SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMakeModules ${CMAKE_MODULE_PATH}) +SET(CMAKE_DEBUG_POSTFIX "d") + +#large address aware option setting +IF(${MINGW}) + SET(LARGEADDRESSAWARE "--large-address-aware") +ELSE(${MINGW}) + IF (WIN32) + SET(LARGEADDRESSAWARE "/LARGEADDRESSAWARE") + ELSE (WIN32) + SET(LARGEADDRESSAWARE " ") + ENDIF (WIN32) +ENDIF (${MINGW}) + +IF (WIN32) + SET(APP_OPT "WIN32") +ELSE (WIN32) + IF (APPLE) + #SET(APP_OPT "MACOSX_BUNDLE") + SET(APP_OPT "EXCLUDE_FROM_ALL") + ELSE (APPLE) + SET(APP_OPT " ") + ENDIF (APPLE) +ENDIF (WIN32) + +# OpenMP +FIND_PACKAGE(OpenMP) +IF(OPENMP_FOUND) + OPTION(WITH_OPENMP "Whether to use parallel processing capabilities of OPENMP. ON/OFF" ON) +ENDIF(OPENMP_FOUND) + +IF(OPENMP_FOUND AND WITH_OPENMP) + MESSAGE(STATUS "With OpenMP ") + SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMAX_OPENMP_NUM_THREADS=${PROCESSOR_COUNT} -DOPENMP_NUM_THREADS=${PROCESSOR_COUNT} ${OpenMP_CXX_FLAGS} -DOPENMP") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMAX_OPENMP_NUM_THREADS=${PROCESSOR_COUNT} -DOPENMP_NUM_THREADS=${PROCESSOR_COUNT} ${OpenMP_CXX_FLAGS} ${OpenMP_C_FLAGS} -DOPENMP") +ELSE(OPENMP_FOUND AND WITH_OPENMP) + MESSAGE(STATUS "Without OpenMP") + SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMAX_OPENMP_NUM_THREADS=1 -DOPENMP_NUM_THREADS=1") + SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMAX_OPENMP_NUM_THREADS=1 -DOPENMP_NUM_THREADS=1") +ENDIF(OPENMP_FOUND AND WITH_OPENMP) + +# OpenCV +FIND_PACKAGE(OpenCV REQUIRED) + +# Boost +#SET(Boost_USE_STATIC_LIBS OFF) +#SET(Boost_USE_MULTITHREAD ON) +#FIND_PACKAGE(Boost REQUIRED COMPONENTS filesystem thread) +#MESSAGE(STATUS "Boost_LIBS: ${Boost_LIBRARIES}") + +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/Src) + +# include header files of libs +INCLUDE_DIRECTORIES(${OPENCV_INCLUDE_DIR}) +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/GeneralLibs/LM2.5/include) +#INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) + +# link libs +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}) +LINK_DIRECTORIES(${CMAKE_BINARY_DIR}/bin) +LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/GeneralLibs/LM2.5/x64libs) + +# Setup output directories +SET(LIBRARY_OUTPUT_PATH + ${PROJECT_BINARY_DIR}/bin + CACHE + PATH + "Single directory for all libraries") + +SET(EXECUTABLE_OUTPUT_PATH + ${PROJECT_BINARY_DIR}/bin + CACHE + PATH + "Single directory for all executables") + +ADD_SUBDIRECTORY(Src) +#ADD_SUBDIRECTORY(GeneralLibs) \ No newline at end of file diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/blaswrap.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/blaswrap.h new file mode 100644 index 0000000..333a17a --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/blaswrap.h @@ -0,0 +1,160 @@ +/* CLAPACK 3.0 BLAS wrapper macros + * Feb 5, 2000 + */ + +#ifndef __BLASWRAP_H +#define __BLASWRAP_H + +#ifndef NO_BLAS_WRAP + +/* BLAS1 routines */ +#define srotg_ f2c_srotg +#define drotg_ f2c_drotg +#define srotmg_ f2c_srotmg +#define drotmg_ f2c_drotmg +#define srot_ f2c_srot +#define drot_ f2c_drot +#define srotm_ f2c_srotm +#define drotm_ f2c_drotm +#define csrot_ f2c_csrot +#define zdrot_ f2c_zdrot +#define sswap_ f2c_sswap +#define dswap_ f2c_dswap +#define cswap_ f2c_cswap +#define zswap_ f2c_zswap +#define sscal_ f2c_sscal +#define dscal_ f2c_dscal +#define cscal_ f2c_cscal +#define zscal_ f2c_zscal +#define csscal_ f2c_csscal +#define zdscal_ f2c_zdscal +#define scopy_ f2c_scopy +#define dcopy_ f2c_dcopy +#define ccopy_ f2c_ccopy +#define zcopy_ f2c_zcopy +#define saxpy_ f2c_saxpy +#define daxpy_ f2c_daxpy +#define caxpy_ f2c_caxpy +#define zaxpy_ f2c_zaxpy +#define sdot_ f2c_sdot +#define ddot_ f2c_ddot +#define cdotu_ f2c_cdotu +#define zdotu_ f2c_zdotu +#define cdotc_ f2c_cdotc +#define zdotc_ f2c_zdotc +#define snrm2_ f2c_snrm2 +#define dnrm2_ f2c_dnrm2 +#define scnrm2_ f2c_scnrm2 +#define dznrm2_ f2c_dznrm2 +#define sasum_ f2c_sasum +#define dasum_ f2c_dasum +#define scasum_ f2c_scasum +#define dzasum_ f2c_dzasum +#define isamax_ f2c_isamax +#define idamax_ f2c_idamax +#define icamax_ f2c_icamax +#define izamax_ f2c_izamax + +/* BLAS2 routines */ +#define sgemv_ f2c_sgemv +#define dgemv_ f2c_dgemv +#define cgemv_ f2c_cgemv +#define zgemv_ f2c_zgemv +#define sgbmv_ f2c_sgbmv +#define dgbmv_ f2c_dgbmv +#define cgbmv_ f2c_cgbmv +#define zgbmv_ f2c_zgbmv +#define chemv_ f2c_chemv +#define zhemv_ f2c_zhemv +#define chbmv_ f2c_chbmv +#define zhbmv_ f2c_zhbmv +#define chpmv_ f2c_chpmv +#define zhpmv_ f2c_zhpmv +#define ssymv_ f2c_ssymv +#define dsymv_ f2c_dsymv +#define ssbmv_ f2c_ssbmv +#define dsbmv_ f2c_dsbmv +#define sspmv_ f2c_sspmv +#define dspmv_ f2c_dspmv +#define strmv_ f2c_strmv +#define dtrmv_ f2c_dtrmv +#define ctrmv_ f2c_ctrmv +#define ztrmv_ f2c_ztrmv +#define stbmv_ f2c_stbmv +#define dtbmv_ f2c_dtbmv +#define ctbmv_ f2c_ctbmv +#define ztbmv_ f2c_ztbmv +#define stpmv_ f2c_stpmv +#define dtpmv_ f2c_dtpmv +#define ctpmv_ f2c_ctpmv +#define ztpmv_ f2c_ztpmv +#define strsv_ f2c_strsv +#define dtrsv_ f2c_dtrsv +#define ctrsv_ f2c_ctrsv +#define ztrsv_ f2c_ztrsv +#define stbsv_ f2c_stbsv +#define dtbsv_ f2c_dtbsv +#define ctbsv_ f2c_ctbsv +#define ztbsv_ f2c_ztbsv +#define stpsv_ f2c_stpsv +#define dtpsv_ f2c_dtpsv +#define ctpsv_ f2c_ctpsv +#define ztpsv_ f2c_ztpsv +#define sger_ f2c_sger +#define dger_ f2c_dger +#define cgeru_ f2c_cgeru +#define zgeru_ f2c_zgeru +#define cgerc_ f2c_cgerc +#define zgerc_ f2c_zgerc +#define cher_ f2c_cher +#define zher_ f2c_zher +#define chpr_ f2c_chpr +#define zhpr_ f2c_zhpr +#define cher2_ f2c_cher2 +#define zher2_ f2c_zher2 +#define chpr2_ f2c_chpr2 +#define zhpr2_ f2c_zhpr2 +#define ssyr_ f2c_ssyr +#define dsyr_ f2c_dsyr +#define sspr_ f2c_sspr +#define dspr_ f2c_dspr +#define ssyr2_ f2c_ssyr2 +#define dsyr2_ f2c_dsyr2 +#define sspr2_ f2c_sspr2 +#define dspr2_ f2c_dspr2 + +/* BLAS3 routines */ +#define sgemm_ f2c_sgemm +#define dgemm_ f2c_dgemm +#define cgemm_ f2c_cgemm +#define zgemm_ f2c_zgemm +#define ssymm_ f2c_ssymm +#define dsymm_ f2c_dsymm +#define csymm_ f2c_csymm +#define zsymm_ f2c_zsymm +#define chemm_ f2c_chemm +#define zhemm_ f2c_zhemm +#define ssyrk_ f2c_ssyrk +#define dsyrk_ f2c_dsyrk +#define csyrk_ f2c_csyrk +#define zsyrk_ f2c_zsyrk +#define cherk_ f2c_cherk +#define zherk_ f2c_zherk +#define ssyr2k_ f2c_ssyr2k +#define dsyr2k_ f2c_dsyr2k +#define csyr2k_ f2c_csyr2k +#define zsyr2k_ f2c_zsyr2k +#define cher2k_ f2c_cher2k +#define zher2k_ f2c_zher2k +#define strmm_ f2c_strmm +#define dtrmm_ f2c_dtrmm +#define ctrmm_ f2c_ctrmm +#define ztrmm_ f2c_ztrmm +#define strsm_ f2c_strsm +#define dtrsm_ f2c_dtrsm +#define ctrsm_ f2c_ctrsm +#define ztrsm_ f2c_ztrsm + +#endif /* NO_BLAS_WRAP */ + +#endif /* __BLASWRAP_H */ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/clapack.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/clapack.h new file mode 100644 index 0000000..34b5778 --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/clapack.h @@ -0,0 +1,5434 @@ +#ifndef __CLAPACK_H +#define __CLAPACK_H + +/* Subroutine */ int cbdsqr_(char *uplo, integer *n, integer *ncvt, integer * + nru, integer *ncc, real *d__, real *e, complex *vt, integer *ldvt, + complex *u, integer *ldu, complex *c__, integer *ldc, real *rwork, + integer *info); + +/* Subroutine */ int cgbbrd_(char *vect, integer *m, integer *n, integer *ncc, + integer *kl, integer *ku, complex *ab, integer *ldab, real *d__, + real *e, complex *q, integer *ldq, complex *pt, integer *ldpt, + complex *c__, integer *ldc, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgbcon_(char *norm, integer *n, integer *kl, integer *ku, + complex *ab, integer *ldab, integer *ipiv, real *anorm, real *rcond, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgbequ_(integer *m, integer *n, integer *kl, integer *ku, + complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real + *colcnd, real *amax, integer *info); + +/* Subroutine */ int cgbrfs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, integer * + ldafb, integer *ipiv, complex *b, integer *ldb, complex *x, integer * + ldx, real *ferr, real *berr, complex *work, real *rwork, integer * + info); + +/* Subroutine */ int cgbsv_(integer *n, integer *kl, integer *ku, integer * + nrhs, complex *ab, integer *ldab, integer *ipiv, complex *b, integer * + ldb, integer *info); + +/* Subroutine */ int cgbsvx_(char *fact, char *trans, integer *n, integer *kl, + integer *ku, integer *nrhs, complex *ab, integer *ldab, complex *afb, + integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, + complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, real + *ferr, real *berr, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgbtf2_(integer *m, integer *n, integer *kl, integer *ku, + complex *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int cgbtrf_(integer *m, integer *n, integer *kl, integer *ku, + complex *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int cgbtrs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, complex *ab, integer *ldab, integer *ipiv, complex + *b, integer *ldb, integer *info); + +/* Subroutine */ int cgebak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, real *scale, integer *m, complex *v, integer *ldv, + integer *info); + +/* Subroutine */ int cgebal_(char *job, integer *n, complex *a, integer *lda, + integer *ilo, integer *ihi, real *scale, integer *info); + +/* Subroutine */ int cgebd2_(integer *m, integer *n, complex *a, integer *lda, + real *d__, real *e, complex *tauq, complex *taup, complex *work, + integer *info); + +/* Subroutine */ int cgebrd_(integer *m, integer *n, complex *a, integer *lda, + real *d__, real *e, complex *tauq, complex *taup, complex *work, + integer *lwork, integer *info); + +/* Subroutine */ int cgecon_(char *norm, integer *n, complex *a, integer *lda, + real *anorm, real *rcond, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgeequ_(integer *m, integer *n, complex *a, integer *lda, + real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, + integer *info); + +/* Subroutine */ int cgees_(char *jobvs, char *sort, L_fp select, integer *n, + complex *a, integer *lda, integer *sdim, complex *w, complex *vs, + integer *ldvs, complex *work, integer *lwork, real *rwork, logical * + bwork, integer *info); + +/* Subroutine */ int cgeesx_(char *jobvs, char *sort, L_fp select, char * + sense, integer *n, complex *a, integer *lda, integer *sdim, complex * + w, complex *vs, integer *ldvs, real *rconde, real *rcondv, complex * + work, integer *lwork, real *rwork, logical *bwork, integer *info); + +/* Subroutine */ int cgeev_(char *jobvl, char *jobvr, integer *n, complex *a, + integer *lda, complex *w, complex *vl, integer *ldvl, complex *vr, + integer *ldvr, complex *work, integer *lwork, real *rwork, integer * + info); + +/* Subroutine */ int cgeevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, complex *a, integer *lda, complex *w, complex *vl, + integer *ldvl, complex *vr, integer *ldvr, integer *ilo, integer *ihi, + real *scale, real *abnrm, real *rconde, real *rcondv, complex *work, + integer *lwork, real *rwork, integer *info); + +/* Subroutine */ int cgegs_(char *jobvsl, char *jobvsr, integer *n, complex * + a, integer *lda, complex *b, integer *ldb, complex *alpha, complex * + beta, complex *vsl, integer *ldvsl, complex *vsr, integer *ldvsr, + complex *work, integer *lwork, real *rwork, integer *info); + +/* Subroutine */ int cgegv_(char *jobvl, char *jobvr, integer *n, complex *a, + integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, + complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex * + work, integer *lwork, real *rwork, integer *info); + +/* Subroutine */ int cgehd2_(integer *n, integer *ilo, integer *ihi, complex * + a, integer *lda, complex *tau, complex *work, integer *info); + +/* Subroutine */ int cgehrd_(integer *n, integer *ilo, integer *ihi, complex * + a, integer *lda, complex *tau, complex *work, integer *lwork, integer + *info); + +/* Subroutine */ int cgelq2_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *info); + +/* Subroutine */ int cgelqf_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cgels_(char *trans, integer *m, integer *n, integer * + nrhs, complex *a, integer *lda, complex *b, integer *ldb, complex * + work, integer *lwork, integer *info); + +/* Subroutine */ int cgelsd_(integer *m, integer *n, integer *nrhs, complex * + a, integer *lda, complex *b, integer *ldb, real *s, real *rcond, + integer *rank, complex *work, integer *lwork, real *rwork, integer * + iwork, integer *info); + +/* Subroutine */ int cgelss_(integer *m, integer *n, integer *nrhs, complex * + a, integer *lda, complex *b, integer *ldb, real *s, real *rcond, + integer *rank, complex *work, integer *lwork, real *rwork, integer * + info); + +/* Subroutine */ int cgelsx_(integer *m, integer *n, integer *nrhs, complex * + a, integer *lda, complex *b, integer *ldb, integer *jpvt, real *rcond, + integer *rank, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgelsy_(integer *m, integer *n, integer *nrhs, complex * + a, integer *lda, complex *b, integer *ldb, integer *jpvt, real *rcond, + integer *rank, complex *work, integer *lwork, real *rwork, integer * + info); + +/* Subroutine */ int cgeql2_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *info); + +/* Subroutine */ int cgeqlf_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cgeqp3_(integer *m, integer *n, complex *a, integer *lda, + integer *jpvt, complex *tau, complex *work, integer *lwork, real * + rwork, integer *info); + +/* Subroutine */ int cgeqpf_(integer *m, integer *n, complex *a, integer *lda, + integer *jpvt, complex *tau, complex *work, real *rwork, integer * + info); + +/* Subroutine */ int cgeqr2_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *info); + +/* Subroutine */ int cgeqrf_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cgerfs_(char *trans, integer *n, integer *nrhs, complex * + a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * + b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgerq2_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *info); + +/* Subroutine */ int cgerqf_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cgesc2_(integer *n, complex *a, integer *lda, complex * + rhs, integer *ipiv, integer *jpiv, real *scale); + +/* Subroutine */ int cgesdd_(char *jobz, integer *m, integer *n, complex *a, + integer *lda, real *s, complex *u, integer *ldu, complex *vt, integer + *ldvt, complex *work, integer *lwork, real *rwork, integer *iwork, + integer *info); + +/* Subroutine */ int cgesv_(integer *n, integer *nrhs, complex *a, integer * + lda, integer *ipiv, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cgesvd_(char *jobu, char *jobvt, integer *m, integer *n, + complex *a, integer *lda, real *s, complex *u, integer *ldu, complex * + vt, integer *ldvt, complex *work, integer *lwork, real *rwork, + integer *info); + +/* Subroutine */ int cgesvx_(char *fact, char *trans, integer *n, integer * + nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * + ipiv, char *equed, real *r__, real *c__, complex *b, integer *ldb, + complex *x, integer *ldx, real *rcond, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgetc2_(integer *n, complex *a, integer *lda, integer * + ipiv, integer *jpiv, integer *info); + +/* Subroutine */ int cgetf2_(integer *m, integer *n, complex *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int cgetrf_(integer *m, integer *n, complex *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int cgetri_(integer *n, complex *a, integer *lda, integer * + ipiv, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cgetrs_(char *trans, integer *n, integer *nrhs, complex * + a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * + info); + +/* Subroutine */ int cggbak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, real *lscale, real *rscale, integer *m, complex *v, + integer *ldv, integer *info); + +/* Subroutine */ int cggbal_(char *job, integer *n, complex *a, integer *lda, + complex *b, integer *ldb, integer *ilo, integer *ihi, real *lscale, + real *rscale, real *work, integer *info); + +/* Subroutine */ int cgges_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, integer *n, complex *a, integer *lda, complex *b, integer * + ldb, integer *sdim, complex *alpha, complex *beta, complex *vsl, + integer *ldvsl, complex *vsr, integer *ldvsr, complex *work, integer * + lwork, real *rwork, logical *bwork, integer *info); + +/* Subroutine */ int cggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, char *sense, integer *n, complex *a, integer *lda, complex *b, + integer *ldb, integer *sdim, complex *alpha, complex *beta, complex * + vsl, integer *ldvsl, complex *vsr, integer *ldvsr, real *rconde, real + *rcondv, complex *work, integer *lwork, real *rwork, integer *iwork, + integer *liwork, logical *bwork, integer *info); + +/* Subroutine */ int cggev_(char *jobvl, char *jobvr, integer *n, complex *a, + integer *lda, complex *b, integer *ldb, complex *alpha, complex *beta, + complex *vl, integer *ldvl, complex *vr, integer *ldvr, complex * + work, integer *lwork, real *rwork, integer *info); + +/* Subroutine */ int cggevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, complex *a, integer *lda, complex *b, integer *ldb, + complex *alpha, complex *beta, complex *vl, integer *ldvl, complex * + vr, integer *ldvr, integer *ilo, integer *ihi, real *lscale, real * + rscale, real *abnrm, real *bbnrm, real *rconde, real *rcondv, complex + *work, integer *lwork, real *rwork, integer *iwork, logical *bwork, + integer *info); + +/* Subroutine */ int cggglm_(integer *n, integer *m, integer *p, complex *a, + integer *lda, complex *b, integer *ldb, complex *d__, complex *x, + complex *y, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cgghrd_(char *compq, char *compz, integer *n, integer * + ilo, integer *ihi, complex *a, integer *lda, complex *b, integer *ldb, + complex *q, integer *ldq, complex *z__, integer *ldz, integer *info); + +/* Subroutine */ int cgglse_(integer *m, integer *n, integer *p, complex *a, + integer *lda, complex *b, integer *ldb, complex *c__, complex *d__, + complex *x, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cggqrf_(integer *n, integer *m, integer *p, complex *a, + integer *lda, complex *taua, complex *b, integer *ldb, complex *taub, + complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cggrqf_(integer *m, integer *p, integer *n, complex *a, + integer *lda, complex *taua, complex *b, integer *ldb, complex *taub, + complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cggsvd_(char *jobu, char *jobv, char *jobq, integer *m, + integer *n, integer *p, integer *k, integer *l, complex *a, integer * + lda, complex *b, integer *ldb, real *alpha, real *beta, complex *u, + integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, + complex *work, real *rwork, integer *iwork, integer *info); + +/* Subroutine */ int cggsvp_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, complex *a, integer *lda, complex *b, integer + *ldb, real *tola, real *tolb, integer *k, integer *l, complex *u, + integer *ldu, complex *v, integer *ldv, complex *q, integer *ldq, + integer *iwork, real *rwork, complex *tau, complex *work, integer * + info); + +/* Subroutine */ int cgtcon_(char *norm, integer *n, complex *dl, complex * + d__, complex *du, complex *du2, integer *ipiv, real *anorm, real * + rcond, complex *work, integer *info); + +/* Subroutine */ int cgtrfs_(char *trans, integer *n, integer *nrhs, complex * + dl, complex *d__, complex *du, complex *dlf, complex *df, complex * + duf, complex *du2, integer *ipiv, complex *b, integer *ldb, complex * + x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int cgtsv_(integer *n, integer *nrhs, complex *dl, complex * + d__, complex *du, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cgtsvx_(char *fact, char *trans, integer *n, integer * + nrhs, complex *dl, complex *d__, complex *du, complex *dlf, complex * + df, complex *duf, complex *du2, integer *ipiv, complex *b, integer * + ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int cgttrf_(integer *n, complex *dl, complex *d__, complex * + du, complex *du2, integer *ipiv, integer *info); + +/* Subroutine */ int cgttrs_(char *trans, integer *n, integer *nrhs, complex * + dl, complex *d__, complex *du, complex *du2, integer *ipiv, complex * + b, integer *ldb, integer *info); + +/* Subroutine */ int cgtts2_(integer *itrans, integer *n, integer *nrhs, + complex *dl, complex *d__, complex *du, complex *du2, integer *ipiv, + complex *b, integer *ldb); + +/* Subroutine */ int chbev_(char *jobz, char *uplo, integer *n, integer *kd, + complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int chbevd_(char *jobz, char *uplo, integer *n, integer *kd, + complex *ab, integer *ldab, real *w, complex *z__, integer *ldz, + complex *work, integer *lwork, real *rwork, integer *lrwork, integer * + iwork, integer *liwork, integer *info); + +/* Subroutine */ int chbevx_(char *jobz, char *range, char *uplo, integer *n, + integer *kd, complex *ab, integer *ldab, complex *q, integer *ldq, + real *vl, real *vu, integer *il, integer *iu, real *abstol, integer * + m, real *w, complex *z__, integer *ldz, complex *work, real *rwork, + integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int chbgst_(char *vect, char *uplo, integer *n, integer *ka, + integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, + complex *x, integer *ldx, complex *work, real *rwork, integer *info); + +/* Subroutine */ int chbgv_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, + real *w, complex *z__, integer *ldz, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int chbgvd_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, complex *ab, integer *ldab, complex *bb, integer *ldbb, + real *w, complex *z__, integer *ldz, complex *work, integer *lwork, + real *rwork, integer *lrwork, integer *iwork, integer *liwork, + integer *info); + +/* Subroutine */ int chbgvx_(char *jobz, char *range, char *uplo, integer *n, + integer *ka, integer *kb, complex *ab, integer *ldab, complex *bb, + integer *ldbb, complex *q, integer *ldq, real *vl, real *vu, integer * + il, integer *iu, real *abstol, integer *m, real *w, complex *z__, + integer *ldz, complex *work, real *rwork, integer *iwork, integer * + ifail, integer *info); + +/* Subroutine */ int chbtrd_(char *vect, char *uplo, integer *n, integer *kd, + complex *ab, integer *ldab, real *d__, real *e, complex *q, integer * + ldq, complex *work, integer *info); + +/* Subroutine */ int checon_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, real *anorm, real *rcond, complex *work, integer * + info); + +/* Subroutine */ int cheev_(char *jobz, char *uplo, integer *n, complex *a, + integer *lda, real *w, complex *work, integer *lwork, real *rwork, + integer *info); + +/* Subroutine */ int cheevd_(char *jobz, char *uplo, integer *n, complex *a, + integer *lda, real *w, complex *work, integer *lwork, real *rwork, + integer *lrwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int cheevr_(char *jobz, char *range, char *uplo, integer *n, + complex *a, integer *lda, real *vl, real *vu, integer *il, integer * + iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, + integer *isuppz, complex *work, integer *lwork, real *rwork, integer * + lrwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int cheevx_(char *jobz, char *range, char *uplo, integer *n, + complex *a, integer *lda, real *vl, real *vu, integer *il, integer * + iu, real *abstol, integer *m, real *w, complex *z__, integer *ldz, + complex *work, integer *lwork, real *rwork, integer *iwork, integer * + ifail, integer *info); + +/* Subroutine */ int chegs2_(integer *itype, char *uplo, integer *n, complex * + a, integer *lda, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int chegst_(integer *itype, char *uplo, integer *n, complex * + a, integer *lda, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int chegv_(integer *itype, char *jobz, char *uplo, integer * + n, complex *a, integer *lda, complex *b, integer *ldb, real *w, + complex *work, integer *lwork, real *rwork, integer *info); + +/* Subroutine */ int chegvd_(integer *itype, char *jobz, char *uplo, integer * + n, complex *a, integer *lda, complex *b, integer *ldb, real *w, + complex *work, integer *lwork, real *rwork, integer *lrwork, integer * + iwork, integer *liwork, integer *info); + +/* Subroutine */ int chegvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, complex *a, integer *lda, complex *b, integer *ldb, + real *vl, real *vu, integer *il, integer *iu, real *abstol, integer * + m, real *w, complex *z__, integer *ldz, complex *work, integer *lwork, + real *rwork, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int cherfs_(char *uplo, integer *n, integer *nrhs, complex * + a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * + b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int chesv_(char *uplo, integer *n, integer *nrhs, complex *a, + integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, + integer *lwork, integer *info); + +/* Subroutine */ int chesvx_(char *fact, char *uplo, integer *n, integer * + nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * + ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, + real *ferr, real *berr, complex *work, integer *lwork, real *rwork, + integer *info); + +/* Subroutine */ int chetd2_(char *uplo, integer *n, complex *a, integer *lda, + real *d__, real *e, complex *tau, integer *info); + +/* Subroutine */ int chetf2_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int chetrd_(char *uplo, integer *n, complex *a, integer *lda, + real *d__, real *e, complex *tau, complex *work, integer *lwork, + integer *info); + +/* Subroutine */ int chetrf_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int chetri_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, complex *work, integer *info); + +/* Subroutine */ int chetrs_(char *uplo, integer *n, integer *nrhs, complex * + a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * + info); + +/* Subroutine */ int chgeqz_(char *job, char *compq, char *compz, integer *n, + integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *t, + integer *ldt, complex *alpha, complex *beta, complex *q, integer *ldq, + complex *z__, integer *ldz, complex *work, integer *lwork, real * + rwork, integer *info); + +/* Subroutine */ int chpcon_(char *uplo, integer *n, complex *ap, integer * + ipiv, real *anorm, real *rcond, complex *work, integer *info); + +/* Subroutine */ int chpev_(char *jobz, char *uplo, integer *n, complex *ap, + real *w, complex *z__, integer *ldz, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int chpevd_(char *jobz, char *uplo, integer *n, complex *ap, + real *w, complex *z__, integer *ldz, complex *work, integer *lwork, + real *rwork, integer *lrwork, integer *iwork, integer *liwork, + integer *info); + +/* Subroutine */ int chpevx_(char *jobz, char *range, char *uplo, integer *n, + complex *ap, real *vl, real *vu, integer *il, integer *iu, real * + abstol, integer *m, real *w, complex *z__, integer *ldz, complex * + work, real *rwork, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int chpgst_(integer *itype, char *uplo, integer *n, complex * + ap, complex *bp, integer *info); + +/* Subroutine */ int chpgv_(integer *itype, char *jobz, char *uplo, integer * + n, complex *ap, complex *bp, real *w, complex *z__, integer *ldz, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int chpgvd_(integer *itype, char *jobz, char *uplo, integer * + n, complex *ap, complex *bp, real *w, complex *z__, integer *ldz, + complex *work, integer *lwork, real *rwork, integer *lrwork, integer * + iwork, integer *liwork, integer *info); + +/* Subroutine */ int chpgvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, complex *ap, complex *bp, real *vl, real *vu, + integer *il, integer *iu, real *abstol, integer *m, real *w, complex * + z__, integer *ldz, complex *work, real *rwork, integer *iwork, + integer *ifail, integer *info); + +/* Subroutine */ int chprfs_(char *uplo, integer *n, integer *nrhs, complex * + ap, complex *afp, integer *ipiv, complex *b, integer *ldb, complex *x, + integer *ldx, real *ferr, real *berr, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int chpsv_(char *uplo, integer *n, integer *nrhs, complex * + ap, integer *ipiv, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int chpsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, complex *ap, complex *afp, integer *ipiv, complex *b, integer * + ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int chptrd_(char *uplo, integer *n, complex *ap, real *d__, + real *e, complex *tau, integer *info); + +/* Subroutine */ int chptrf_(char *uplo, integer *n, complex *ap, integer * + ipiv, integer *info); + +/* Subroutine */ int chptri_(char *uplo, integer *n, complex *ap, integer * + ipiv, complex *work, integer *info); + +/* Subroutine */ int chptrs_(char *uplo, integer *n, integer *nrhs, complex * + ap, integer *ipiv, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int chsein_(char *side, char *eigsrc, char *initv, logical * + select, integer *n, complex *h__, integer *ldh, complex *w, complex * + vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, integer * + m, complex *work, real *rwork, integer *ifaill, integer *ifailr, + integer *info); + +/* Subroutine */ int chseqr_(char *job, char *compz, integer *n, integer *ilo, + integer *ihi, complex *h__, integer *ldh, complex *w, complex *z__, + integer *ldz, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int clabrd_(integer *m, integer *n, integer *nb, complex *a, + integer *lda, real *d__, real *e, complex *tauq, complex *taup, + complex *x, integer *ldx, complex *y, integer *ldy); + +/* Subroutine */ int clacgv_(integer *n, complex *x, integer *incx); + +/* Subroutine */ int clacn2_(integer *n, complex *v, complex *x, real *est, + integer *kase, integer *isave); + +/* Subroutine */ int clacon_(integer *n, complex *v, complex *x, real *est, + integer *kase); + +/* Subroutine */ int clacp2_(char *uplo, integer *m, integer *n, real *a, + integer *lda, complex *b, integer *ldb); + +/* Subroutine */ int clacpy_(char *uplo, integer *m, integer *n, complex *a, + integer *lda, complex *b, integer *ldb); + +/* Subroutine */ int clacrm_(integer *m, integer *n, complex *a, integer *lda, + real *b, integer *ldb, complex *c__, integer *ldc, real *rwork); + +/* Subroutine */ int clacrt_(integer *n, complex *cx, integer *incx, complex * + cy, integer *incy, complex *c__, complex *s); + +/* Complex */ VOID cladiv_(complex * ret_val, complex *x, complex *y); + +/* Subroutine */ int claed0_(integer *qsiz, integer *n, real *d__, real *e, + complex *q, integer *ldq, complex *qstore, integer *ldqs, real *rwork, + integer *iwork, integer *info); + +/* Subroutine */ int claed7_(integer *n, integer *cutpnt, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, real *d__, complex * + q, integer *ldq, real *rho, integer *indxq, real *qstore, integer * + qptr, integer *prmptr, integer *perm, integer *givptr, integer * + givcol, real *givnum, complex *work, real *rwork, integer *iwork, + integer *info); + +/* Subroutine */ int claed8_(integer *k, integer *n, integer *qsiz, complex * + q, integer *ldq, real *d__, real *rho, integer *cutpnt, real *z__, + real *dlamda, complex *q2, integer *ldq2, real *w, integer *indxp, + integer *indx, integer *indxq, integer *perm, integer *givptr, + integer *givcol, real *givnum, integer *info); + +/* Subroutine */ int claein_(logical *rightv, logical *noinit, integer *n, + complex *h__, integer *ldh, complex *w, complex *v, complex *b, + integer *ldb, real *rwork, real *eps3, real *smlnum, integer *info); + +/* Subroutine */ int claesy_(complex *a, complex *b, complex *c__, complex * + rt1, complex *rt2, complex *evscal, complex *cs1, complex *sn1); + +/* Subroutine */ int claev2_(complex *a, complex *b, complex *c__, real *rt1, + real *rt2, real *cs1, complex *sn1); + +/* Subroutine */ int clag2z_(integer *m, integer *n, complex *sa, integer * + ldsa, doublecomplex *a, integer *lda, integer *info); + +/* Subroutine */ int clags2_(logical *upper, real *a1, complex *a2, real *a3, + real *b1, complex *b2, real *b3, real *csu, complex *snu, real *csv, + complex *snv, real *csq, complex *snq); + +/* Subroutine */ int clagtm_(char *trans, integer *n, integer *nrhs, real * + alpha, complex *dl, complex *d__, complex *du, complex *x, integer * + ldx, real *beta, complex *b, integer *ldb); + +/* Subroutine */ int clahef_(char *uplo, integer *n, integer *nb, integer *kb, + complex *a, integer *lda, integer *ipiv, complex *w, integer *ldw, + integer *info); + +/* Subroutine */ int clahqr_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, + integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * + info); + +/* Subroutine */ int clahr2_(integer *n, integer *k, integer *nb, complex *a, + integer *lda, complex *tau, complex *t, integer *ldt, complex *y, + integer *ldy); + +/* Subroutine */ int clahrd_(integer *n, integer *k, integer *nb, complex *a, + integer *lda, complex *tau, complex *t, integer *ldt, complex *y, + integer *ldy); + +/* Subroutine */ int claic1_(integer *job, integer *j, complex *x, real *sest, + complex *w, complex *gamma, real *sestpr, complex *s, complex *c__); + +/* Subroutine */ int clals0_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *nrhs, complex *b, integer *ldb, complex *bx, + integer *ldbx, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * + difl, real *difr, real *z__, integer *k, real *c__, real *s, real * + rwork, integer *info); + +/* Subroutine */ int clalsa_(integer *icompq, integer *smlsiz, integer *n, + integer *nrhs, complex *b, integer *ldb, complex *bx, integer *ldbx, + real *u, integer *ldu, real *vt, integer *k, real *difl, real *difr, + real *z__, real *poles, integer *givptr, integer *givcol, integer * + ldgcol, integer *perm, real *givnum, real *c__, real *s, real *rwork, + integer *iwork, integer *info); + +/* Subroutine */ int clalsd_(char *uplo, integer *smlsiz, integer *n, integer + *nrhs, real *d__, real *e, complex *b, integer *ldb, real *rcond, + integer *rank, complex *work, real *rwork, integer *iwork, integer * + info); + +/* Subroutine */ int clapll_(integer *n, complex *x, integer *incx, complex * + y, integer *incy, real *ssmin); + +/* Subroutine */ int clapmt_(logical *forwrd, integer *m, integer *n, complex + *x, integer *ldx, integer *k); + +/* Subroutine */ int claqgb_(integer *m, integer *n, integer *kl, integer *ku, + complex *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real + *colcnd, real *amax, char *equed); + +/* Subroutine */ int claqge_(integer *m, integer *n, complex *a, integer *lda, + real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * + equed); + +/* Subroutine */ int claqhb_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, real *s, real *scond, real *amax, char *equed ); + +/* Subroutine */ int claqhe_(char *uplo, integer *n, complex *a, integer *lda, + real *s, real *scond, real *amax, char *equed); + +/* Subroutine */ int claqhp_(char *uplo, integer *n, complex *ap, real *s, + real *scond, real *amax, char *equed ); + +/* Subroutine */ int claqp2_(integer *m, integer *n, integer *offset, complex + *a, integer *lda, integer *jpvt, complex *tau, real *vn1, real *vn2, + complex *work); + +/* Subroutine */ int claqps_(integer *m, integer *n, integer *offset, integer + *nb, integer *kb, complex *a, integer *lda, integer *jpvt, complex * + tau, real *vn1, real *vn2, complex *auxv, complex *f, integer *ldf); + +/* Subroutine */ int claqr0_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, + integer *iloz, integer *ihiz, complex *z__, integer *ldz, complex * + work, integer *lwork, integer *info); + +/* Subroutine */ int claqr1_(integer *n, complex *h__, integer *ldh, complex * + s1, complex *s2, complex *v); + +/* Subroutine */ int claqr2_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, complex *h__, integer *ldh, + integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * + ns, integer *nd, complex *sh, complex *v, integer *ldv, integer *nh, + complex *t, integer *ldt, integer *nv, complex *wv, integer *ldwv, + complex *work, integer *lwork); + +/* Subroutine */ int claqr3_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, complex *h__, integer *ldh, + integer *iloz, integer *ihiz, complex *z__, integer *ldz, integer * + ns, integer *nd, complex *sh, complex *v, integer *ldv, integer *nh, + complex *t, integer *ldt, integer *nv, complex *wv, integer *ldwv, + complex *work, integer *lwork); + +/* Subroutine */ int claqr4_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, complex *h__, integer *ldh, complex *w, + integer *iloz, integer *ihiz, complex *z__, integer *ldz, complex * + work, integer *lwork, integer *info); + +/* Subroutine */ int claqr5_(logical *wantt, logical *wantz, integer *kacc22, + integer *n, integer *ktop, integer *kbot, integer *nshfts, complex *s, + complex *h__, integer *ldh, integer *iloz, integer *ihiz, complex * + z__, integer *ldz, complex *v, integer *ldv, complex *u, integer *ldu, + integer *nv, complex *wv, integer *ldwv, integer *nh, complex *wh, + integer *ldwh); + +/* Subroutine */ int claqsb_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, real *s, real *scond, real *amax, char *equed ); + +/* Subroutine */ int claqsp_(char *uplo, integer *n, complex *ap, real *s, + real *scond, real *amax, char *equed ); + +/* Subroutine */ int claqsy_(char *uplo, integer *n, complex *a, integer *lda, + real *s, real *scond, real *amax, char *equed); + +/* Subroutine */ int clar1v_(integer *n, integer *b1, integer *bn, real * + lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * + gaptol, complex *z__, logical *wantnc, integer *negcnt, real *ztz, + real *mingma, integer *r__, integer *isuppz, real *nrminv, real * + resid, real *rqcorr, real *work); + +/* Subroutine */ int clar2v_(integer *n, complex *x, complex *y, complex *z__, + integer *incx, real *c__, complex *s, integer *incc); + +/* Subroutine */ int clarcm_(integer *m, integer *n, real *a, integer *lda, + complex *b, integer *ldb, complex *c__, integer *ldc, real *rwork); + +/* Subroutine */ int clarf_(char *side, integer *m, integer *n, complex *v, + integer *incv, complex *tau, complex *c__, integer *ldc, complex * + work); + +/* Subroutine */ int clarfb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, complex *v, integer *ldv, + complex *t, integer *ldt, complex *c__, integer *ldc, complex *work, + integer *ldwork); + +/* Subroutine */ int clarfg_(integer *n, complex *alpha, complex *x, integer * + incx, complex *tau); + +/* Subroutine */ int clarft_(char *direct, char *storev, integer *n, integer * + k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt); + +/* Subroutine */ int clarfx_(char *side, integer *m, integer *n, complex *v, + complex *tau, complex *c__, integer *ldc, complex *work ); + +/* Subroutine */ int clargv_(integer *n, complex *x, integer *incx, complex * + y, integer *incy, real *c__, integer *incc); + +/* Subroutine */ int clarnv_(integer *idist, integer *iseed, integer *n, + complex *x); + +/* Subroutine */ int clarrv_(integer *n, real *vl, real *vu, real *d__, real * + l, real *pivmin, integer *isplit, integer *m, integer *dol, integer * + dou, real *minrgp, real *rtol1, real *rtol2, real *w, real *werr, + real *wgap, integer *iblock, integer *indexw, real *gers, complex * + z__, integer *ldz, integer *isuppz, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int clartg_(complex *f, complex *g, real *cs, complex *sn, + complex *r__); + +/* Subroutine */ int clartv_(integer *n, complex *x, integer *incx, complex * + y, integer *incy, real *c__, complex *s, integer *incc); + +/* Subroutine */ int clarz_(char *side, integer *m, integer *n, integer *l, + complex *v, integer *incv, complex *tau, complex *c__, integer *ldc, + complex *work); + +/* Subroutine */ int clarzb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, integer *l, complex *v, + integer *ldv, complex *t, integer *ldt, complex *c__, integer *ldc, + complex *work, integer *ldwork); + +/* Subroutine */ int clarzt_(char *direct, char *storev, integer *n, integer * + k, complex *v, integer *ldv, complex *tau, complex *t, integer *ldt); + +/* Subroutine */ int clascl_(char *type__, integer *kl, integer *ku, real * + cfrom, real *cto, integer *m, integer *n, complex *a, integer *lda, + integer *info); + +/* Subroutine */ int claset_(char *uplo, integer *m, integer *n, complex * + alpha, complex *beta, complex *a, integer *lda); + +/* Subroutine */ int clasr_(char *side, char *pivot, char *direct, integer *m, + integer *n, real *c__, real *s, complex *a, integer *lda ); + +/* Subroutine */ int classq_(integer *n, complex *x, integer *incx, real * + scale, real *sumsq); + +/* Subroutine */ int claswp_(integer *n, complex *a, integer *lda, integer * + k1, integer *k2, integer *ipiv, integer *incx); + +/* Subroutine */ int clasyf_(char *uplo, integer *n, integer *nb, integer *kb, + complex *a, integer *lda, integer *ipiv, complex *w, integer *ldw, + integer *info); + +/* Subroutine */ int clatbs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, integer *kd, complex *ab, integer *ldab, complex * + x, real *scale, real *cnorm, integer *info); + +/* Subroutine */ int clatdf_(integer *ijob, integer *n, complex *z__, integer + *ldz, complex *rhs, real *rdsum, real *rdscal, integer *ipiv, integer + *jpiv); + +/* Subroutine */ int clatps_(char *uplo, char *trans, char *diag, char * + normin, integer *n, complex *ap, complex *x, real *scale, real *cnorm, + integer *info); + +/* Subroutine */ int clatrd_(char *uplo, integer *n, integer *nb, complex *a, + integer *lda, real *e, complex *tau, complex *w, integer *ldw ); + +/* Subroutine */ int clatrs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, complex *a, integer *lda, complex *x, real *scale, + real *cnorm, integer *info); + +/* Subroutine */ int clatrz_(integer *m, integer *n, integer *l, complex *a, + integer *lda, complex *tau, complex *work); + +/* Subroutine */ int clatzm_(char *side, integer *m, integer *n, complex *v, + integer *incv, complex *tau, complex *c1, complex *c2, integer *ldc, + complex *work); + +/* Subroutine */ int clauu2_(char *uplo, integer *n, complex *a, integer *lda, + integer *info); + +/* Subroutine */ int clauum_(char *uplo, integer *n, complex *a, integer *lda, + integer *info); + +/* Subroutine */ int cpbcon_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, real *anorm, real *rcond, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int cpbequ_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, real *s, real *scond, real *amax, integer *info); + +/* Subroutine */ int cpbrfs_(char *uplo, integer *n, integer *kd, integer * + nrhs, complex *ab, integer *ldab, complex *afb, integer *ldafb, + complex *b, integer *ldb, complex *x, integer *ldx, real *ferr, real * + berr, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cpbstf_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, integer *info); + +/* Subroutine */ int cpbsv_(char *uplo, integer *n, integer *kd, integer * + nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer * + info); + +/* Subroutine */ int cpbsvx_(char *fact, char *uplo, integer *n, integer *kd, + integer *nrhs, complex *ab, integer *ldab, complex *afb, integer * + ldafb, char *equed, real *s, complex *b, integer *ldb, complex *x, + integer *ldx, real *rcond, real *ferr, real *berr, complex *work, + real *rwork, integer *info); + +/* Subroutine */ int cpbtf2_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, integer *info); + +/* Subroutine */ int cpbtrf_(char *uplo, integer *n, integer *kd, complex *ab, + integer *ldab, integer *info); + +/* Subroutine */ int cpbtrs_(char *uplo, integer *n, integer *kd, integer * + nrhs, complex *ab, integer *ldab, complex *b, integer *ldb, integer * + info); + +/* Subroutine */ int cpocon_(char *uplo, integer *n, complex *a, integer *lda, + real *anorm, real *rcond, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cpoequ_(integer *n, complex *a, integer *lda, real *s, + real *scond, real *amax, integer *info); + +/* Subroutine */ int cporfs_(char *uplo, integer *n, integer *nrhs, complex * + a, integer *lda, complex *af, integer *ldaf, complex *b, integer *ldb, + complex *x, integer *ldx, real *ferr, real *berr, complex *work, + real *rwork, integer *info); + +/* Subroutine */ int cposv_(char *uplo, integer *n, integer *nrhs, complex *a, + integer *lda, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cposvx_(char *fact, char *uplo, integer *n, integer * + nrhs, complex *a, integer *lda, complex *af, integer *ldaf, char * + equed, real *s, complex *b, integer *ldb, complex *x, integer *ldx, + real *rcond, real *ferr, real *berr, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int cpotf2_(char *uplo, integer *n, complex *a, integer *lda, + integer *info); + +/* Subroutine */ int cpotrf_(char *uplo, integer *n, complex *a, integer *lda, + integer *info); + +/* Subroutine */ int cpotri_(char *uplo, integer *n, complex *a, integer *lda, + integer *info); + +/* Subroutine */ int cpotrs_(char *uplo, integer *n, integer *nrhs, complex * + a, integer *lda, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cppcon_(char *uplo, integer *n, complex *ap, real *anorm, + real *rcond, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cppequ_(char *uplo, integer *n, complex *ap, real *s, + real *scond, real *amax, integer *info); + +/* Subroutine */ int cpprfs_(char *uplo, integer *n, integer *nrhs, complex * + ap, complex *afp, complex *b, integer *ldb, complex *x, integer *ldx, + real *ferr, real *berr, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cppsv_(char *uplo, integer *n, integer *nrhs, complex * + ap, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cppsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, complex *ap, complex *afp, char *equed, real *s, complex *b, + integer *ldb, complex *x, integer *ldx, real *rcond, real *ferr, real + *berr, complex *work, real *rwork, integer *info); + +/* Subroutine */ int cpptrf_(char *uplo, integer *n, complex *ap, integer * + info); + +/* Subroutine */ int cpptri_(char *uplo, integer *n, complex *ap, integer * + info); + +/* Subroutine */ int cpptrs_(char *uplo, integer *n, integer *nrhs, complex * + ap, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cptcon_(integer *n, real *d__, complex *e, real *anorm, + real *rcond, real *rwork, integer *info); + +/* Subroutine */ int cpteqr_(char *compz, integer *n, real *d__, real *e, + complex *z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int cptrfs_(char *uplo, integer *n, integer *nrhs, real *d__, + complex *e, real *df, complex *ef, complex *b, integer *ldb, complex + *x, integer *ldx, real *ferr, real *berr, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int cptsv_(integer *n, integer *nrhs, real *d__, complex *e, + complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cptsvx_(char *fact, integer *n, integer *nrhs, real *d__, + complex *e, real *df, complex *ef, complex *b, integer *ldb, complex + *x, integer *ldx, real *rcond, real *ferr, real *berr, complex *work, + real *rwork, integer *info); + +/* Subroutine */ int cpttrf_(integer *n, real *d__, complex *e, integer *info); + +/* Subroutine */ int cpttrs_(char *uplo, integer *n, integer *nrhs, real *d__, + complex *e, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cptts2_(integer *iuplo, integer *n, integer *nrhs, real * + d__, complex *e, complex *b, integer *ldb); + +/* Subroutine */ int crot_(integer *n, complex *cx, integer *incx, complex * + cy, integer *incy, real *c__, complex *s); + +/* Subroutine */ int cspcon_(char *uplo, integer *n, complex *ap, integer * + ipiv, real *anorm, real *rcond, complex *work, integer *info); + +/* Subroutine */ int cspmv_(char *uplo, integer *n, complex *alpha, complex * + ap, complex *x, integer *incx, complex *beta, complex *y, integer * + incy); + +/* Subroutine */ int cspr_(char *uplo, integer *n, complex *alpha, complex *x, + integer *incx, complex *ap); + +/* Subroutine */ int csprfs_(char *uplo, integer *n, integer *nrhs, complex * + ap, complex *afp, integer *ipiv, complex *b, integer *ldb, complex *x, + integer *ldx, real *ferr, real *berr, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int cspsv_(char *uplo, integer *n, integer *nrhs, complex * + ap, integer *ipiv, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int cspsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, complex *ap, complex *afp, integer *ipiv, complex *b, integer * + ldb, complex *x, integer *ldx, real *rcond, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int csptrf_(char *uplo, integer *n, complex *ap, integer * + ipiv, integer *info); + +/* Subroutine */ int csptri_(char *uplo, integer *n, complex *ap, integer * + ipiv, complex *work, integer *info); + +/* Subroutine */ int csptrs_(char *uplo, integer *n, integer *nrhs, complex * + ap, integer *ipiv, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int csrscl_(integer *n, real *sa, complex *sx, integer *incx); + +/* Subroutine */ int cstedc_(char *compz, integer *n, real *d__, real *e, + complex *z__, integer *ldz, complex *work, integer *lwork, real * + rwork, integer *lrwork, integer *iwork, integer *liwork, integer * + info); + +/* Subroutine */ int cstegr_(char *jobz, char *range, integer *n, real *d__, + real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, + integer *m, real *w, complex *z__, integer *ldz, integer *isuppz, + real *work, integer *lwork, integer *iwork, integer *liwork, integer * + info); + +/* Subroutine */ int cstein_(integer *n, real *d__, real *e, integer *m, real + *w, integer *iblock, integer *isplit, complex *z__, integer *ldz, + real *work, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int cstemr_(char *jobz, char *range, integer *n, real *d__, + real *e, real *vl, real *vu, integer *il, integer *iu, integer *m, + real *w, complex *z__, integer *ldz, integer *nzc, integer *isuppz, + logical *tryrac, real *work, integer *lwork, integer *iwork, integer * + liwork, integer *info); + +/* Subroutine */ int csteqr_(char *compz, integer *n, real *d__, real *e, + complex *z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int csycon_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, real *anorm, real *rcond, complex *work, integer * + info); + +/* Subroutine */ int csymv_(char *uplo, integer *n, complex *alpha, complex * + a, integer *lda, complex *x, integer *incx, complex *beta, complex *y, + integer *incy); + +/* Subroutine */ int csyr_(char *uplo, integer *n, complex *alpha, complex *x, + integer *incx, complex *a, integer *lda); + +/* Subroutine */ int csyrfs_(char *uplo, integer *n, integer *nrhs, complex * + a, integer *lda, complex *af, integer *ldaf, integer *ipiv, complex * + b, integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int csysv_(char *uplo, integer *n, integer *nrhs, complex *a, + integer *lda, integer *ipiv, complex *b, integer *ldb, complex *work, + integer *lwork, integer *info); + +/* Subroutine */ int csysvx_(char *fact, char *uplo, integer *n, integer * + nrhs, complex *a, integer *lda, complex *af, integer *ldaf, integer * + ipiv, complex *b, integer *ldb, complex *x, integer *ldx, real *rcond, + real *ferr, real *berr, complex *work, integer *lwork, real *rwork, + integer *info); + +/* Subroutine */ int csytf2_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int csytrf_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int csytri_(char *uplo, integer *n, complex *a, integer *lda, + integer *ipiv, complex *work, integer *info); + +/* Subroutine */ int csytrs_(char *uplo, integer *n, integer *nrhs, complex * + a, integer *lda, integer *ipiv, complex *b, integer *ldb, integer * + info); + +/* Subroutine */ int ctbcon_(char *norm, char *uplo, char *diag, integer *n, + integer *kd, complex *ab, integer *ldab, real *rcond, complex *work, + real *rwork, integer *info); + +/* Subroutine */ int ctbrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, + integer *ldb, complex *x, integer *ldx, real *ferr, real *berr, + complex *work, real *rwork, integer *info); + +/* Subroutine */ int ctbtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, complex *ab, integer *ldab, complex *b, + integer *ldb, integer *info); + +/* Subroutine */ int ctgevc_(char *side, char *howmny, logical *select, + integer *n, complex *s, integer *lds, complex *p, integer *ldp, + complex *vl, integer *ldvl, complex *vr, integer *ldvr, integer *mm, + integer *m, complex *work, real *rwork, integer *info); + +/* Subroutine */ int ctgex2_(logical *wantq, logical *wantz, integer *n, + complex *a, integer *lda, complex *b, integer *ldb, complex *q, + integer *ldq, complex *z__, integer *ldz, integer *j1, integer *info); + +/* Subroutine */ int ctgexc_(logical *wantq, logical *wantz, integer *n, + complex *a, integer *lda, complex *b, integer *ldb, complex *q, + integer *ldq, complex *z__, integer *ldz, integer *ifst, integer * + ilst, integer *info); + +/* Subroutine */ int ctgsen_(integer *ijob, logical *wantq, logical *wantz, + logical *select, integer *n, complex *a, integer *lda, complex *b, + integer *ldb, complex *alpha, complex *beta, complex *q, integer *ldq, + complex *z__, integer *ldz, integer *m, real *pl, real *pr, real * + dif, complex *work, integer *lwork, integer *iwork, integer *liwork, + integer *info); + +/* Subroutine */ int ctgsja_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, integer *k, integer *l, complex *a, integer * + lda, complex *b, integer *ldb, real *tola, real *tolb, real *alpha, + real *beta, complex *u, integer *ldu, complex *v, integer *ldv, + complex *q, integer *ldq, complex *work, integer *ncycle, integer * + info); + +/* Subroutine */ int ctgsna_(char *job, char *howmny, logical *select, + integer *n, complex *a, integer *lda, complex *b, integer *ldb, + complex *vl, integer *ldvl, complex *vr, integer *ldvr, real *s, real + *dif, integer *mm, integer *m, complex *work, integer *lwork, integer + *iwork, integer *info); + +/* Subroutine */ int ctgsy2_(char *trans, integer *ijob, integer *m, integer * + n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, + integer *ldc, complex *d__, integer *ldd, complex *e, integer *lde, + complex *f, integer *ldf, real *scale, real *rdsum, real *rdscal, + integer *info); + +/* Subroutine */ int ctgsyl_(char *trans, integer *ijob, integer *m, integer * + n, complex *a, integer *lda, complex *b, integer *ldb, complex *c__, + integer *ldc, complex *d__, integer *ldd, complex *e, integer *lde, + complex *f, integer *ldf, real *scale, real *dif, complex *work, + integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int ctpcon_(char *norm, char *uplo, char *diag, integer *n, + complex *ap, real *rcond, complex *work, real *rwork, integer *info); + +/* Subroutine */ int ctprfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, complex *ap, complex *b, integer *ldb, complex *x, + integer *ldx, real *ferr, real *berr, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int ctptri_(char *uplo, char *diag, integer *n, complex *ap, + integer *info); + +/* Subroutine */ int ctptrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, complex *ap, complex *b, integer *ldb, integer *info); + +/* Subroutine */ int ctrcon_(char *norm, char *uplo, char *diag, integer *n, + complex *a, integer *lda, real *rcond, complex *work, real *rwork, + integer *info); + +/* Subroutine */ int ctrevc_(char *side, char *howmny, logical *select, + integer *n, complex *t, integer *ldt, complex *vl, integer *ldvl, + complex *vr, integer *ldvr, integer *mm, integer *m, complex *work, + real *rwork, integer *info); + +/* Subroutine */ int ctrexc_(char *compq, integer *n, complex *t, integer * + ldt, complex *q, integer *ldq, integer *ifst, integer *ilst, integer * + info); + +/* Subroutine */ int ctrrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, + complex *x, integer *ldx, real *ferr, real *berr, complex *work, real + *rwork, integer *info); + +/* Subroutine */ int ctrsen_(char *job, char *compq, logical *select, integer + *n, complex *t, integer *ldt, complex *q, integer *ldq, complex *w, + integer *m, real *s, real *sep, complex *work, integer *lwork, + integer *info); + +/* Subroutine */ int ctrsna_(char *job, char *howmny, logical *select, + integer *n, complex *t, integer *ldt, complex *vl, integer *ldvl, + complex *vr, integer *ldvr, real *s, real *sep, integer *mm, integer * + m, complex *work, integer *ldwork, real *rwork, integer *info); + +/* Subroutine */ int ctrsyl_(char *trana, char *tranb, integer *isgn, integer + *m, integer *n, complex *a, integer *lda, complex *b, integer *ldb, + complex *c__, integer *ldc, real *scale, integer *info); + +/* Subroutine */ int ctrti2_(char *uplo, char *diag, integer *n, complex *a, + integer *lda, integer *info); + +/* Subroutine */ int ctrtri_(char *uplo, char *diag, integer *n, complex *a, + integer *lda, integer *info); + +/* Subroutine */ int ctrtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, complex *a, integer *lda, complex *b, integer *ldb, + integer *info); + +/* Subroutine */ int ctzrqf_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, integer *info); + +/* Subroutine */ int ctzrzf_(integer *m, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cung2l_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *info); + +/* Subroutine */ int cung2r_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *info); + +/* Subroutine */ int cungbr_(char *vect, integer *m, integer *n, integer *k, + complex *a, integer *lda, complex *tau, complex *work, integer *lwork, + integer *info); + +/* Subroutine */ int cunghr_(integer *n, integer *ilo, integer *ihi, complex * + a, integer *lda, complex *tau, complex *work, integer *lwork, integer + *info); + +/* Subroutine */ int cungl2_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *info); + +/* Subroutine */ int cunglq_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *lwork, integer * + info); + +/* Subroutine */ int cungql_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *lwork, integer * + info); + +/* Subroutine */ int cungqr_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *lwork, integer * + info); + +/* Subroutine */ int cungr2_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *info); + +/* Subroutine */ int cungrq_(integer *m, integer *n, integer *k, complex *a, + integer *lda, complex *tau, complex *work, integer *lwork, integer * + info); + +/* Subroutine */ int cungtr_(char *uplo, integer *n, complex *a, integer *lda, + complex *tau, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cunm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *info); + +/* Subroutine */ int cunm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *info); + +/* Subroutine */ int cunmbr_(char *vect, char *side, char *trans, integer *m, + integer *n, integer *k, complex *a, integer *lda, complex *tau, + complex *c__, integer *ldc, complex *work, integer *lwork, integer * + info); + +/* Subroutine */ int cunmhr_(char *side, char *trans, integer *m, integer *n, + integer *ilo, integer *ihi, complex *a, integer *lda, complex *tau, + complex *c__, integer *ldc, complex *work, integer *lwork, integer * + info); + +/* Subroutine */ int cunml2_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *info); + +/* Subroutine */ int cunmlq_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cunmql_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cunmqr_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *lwork, integer *info); + +/* Subroutine */ int cunmr2_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *info); + +/* Subroutine */ int cunmr3_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, complex *a, integer *lda, complex *tau, + complex *c__, integer *ldc, complex *work, integer *info); + +/* Subroutine */ int cunmrq_(char *side, char *trans, integer *m, integer *n, + integer *k, complex *a, integer *lda, complex *tau, complex *c__, + integer *ldc, complex *work, integer *lwork, integer *iinfo); + +/* Subroutine */ int cupgtr_(char *uplo, integer *n, complex *ap, complex * + tau, complex *q, integer *ldq, complex *work, integer *info); + +/* Subroutine */ int cupmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, complex *ap, complex *tau, complex *c__, integer *ldc, + complex *work, integer *info); + +/* Subroutine */ int dbdsdc_(char *uplo, char *compq, integer *n, doublereal * + d__, doublereal *e, doublereal *u, integer *ldu, doublereal *vt, + integer *ldvt, doublereal *q, integer *iq, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dbdsqr_(char *uplo, integer *n, integer *ncvt, integer * + nru, integer *ncc, doublereal *d__, doublereal *e, doublereal *vt, + integer *ldvt, doublereal *u, integer *ldu, doublereal *c__, integer * + ldc, doublereal *work, integer *info); + +/* Subroutine */ int ddisna_(char *job, integer *m, integer *n, doublereal * + d__, doublereal *sep, integer *info); + +/* Subroutine */ int dgbbrd_(char *vect, integer *m, integer *n, integer *ncc, + integer *kl, integer *ku, doublereal *ab, integer *ldab, doublereal * + d__, doublereal *e, doublereal *q, integer *ldq, doublereal *pt, + integer *ldpt, doublereal *c__, integer *ldc, doublereal *work, + integer *info); + +/* Subroutine */ int dgbcon_(char *norm, integer *n, integer *kl, integer *ku, + doublereal *ab, integer *ldab, integer *ipiv, doublereal *anorm, + doublereal *rcond, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dgbequ_(integer *m, integer *n, integer *kl, integer *ku, + doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, + doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * + info); + +/* Subroutine */ int dgbrfs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, + integer *ldafb, integer *ipiv, doublereal *b, integer *ldb, + doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dgbsv_(integer *n, integer *kl, integer *ku, integer * + nrhs, doublereal *ab, integer *ldab, integer *ipiv, doublereal *b, + integer *ldb, integer *info); + +/* Subroutine */ int dgbsvx_(char *fact, char *trans, integer *n, integer *kl, + integer *ku, integer *nrhs, doublereal *ab, integer *ldab, + doublereal *afb, integer *ldafb, integer *ipiv, char *equed, + doublereal *r__, doublereal *c__, doublereal *b, integer *ldb, + doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, + doublereal *berr, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dgbtf2_(integer *m, integer *n, integer *kl, integer *ku, + doublereal *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int dgbtrf_(integer *m, integer *n, integer *kl, integer *ku, + doublereal *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int dgbtrs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, doublereal *ab, integer *ldab, integer *ipiv, + doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dgebak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, doublereal *scale, integer *m, doublereal *v, integer * + ldv, integer *info); + +/* Subroutine */ int dgebal_(char *job, integer *n, doublereal *a, integer * + lda, integer *ilo, integer *ihi, doublereal *scale, integer *info); + +/* Subroutine */ int dgebd2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * + taup, doublereal *work, integer *info); + +/* Subroutine */ int dgebrd_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tauq, doublereal * + taup, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgecon_(char *norm, integer *n, doublereal *a, integer * + lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dgeequ_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal + *colcnd, doublereal *amax, integer *info); + +/* Subroutine */ int dgees_(char *jobvs, char *sort, L_fp select, integer *n, + doublereal *a, integer *lda, integer *sdim, doublereal *wr, + doublereal *wi, doublereal *vs, integer *ldvs, doublereal *work, + integer *lwork, logical *bwork, integer *info); + +/* Subroutine */ int dgeesx_(char *jobvs, char *sort, L_fp select, char * + sense, integer *n, doublereal *a, integer *lda, integer *sdim, + doublereal *wr, doublereal *wi, doublereal *vs, integer *ldvs, + doublereal *rconde, doublereal *rcondv, doublereal *work, integer * + lwork, integer *iwork, integer *liwork, logical *bwork, integer *info); + +/* Subroutine */ int dgeev_(char *jobvl, char *jobvr, integer *n, doublereal * + a, integer *lda, doublereal *wr, doublereal *wi, doublereal *vl, + integer *ldvl, doublereal *vr, integer *ldvr, doublereal *work, + integer *lwork, integer *info); + +/* Subroutine */ int dgeevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, doublereal *a, integer *lda, doublereal *wr, + doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, + integer *ldvr, integer *ilo, integer *ihi, doublereal *scale, + doublereal *abnrm, doublereal *rconde, doublereal *rcondv, doublereal + *work, integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int dgegs_(char *jobvsl, char *jobvsr, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + alphar, doublereal *alphai, doublereal *beta, doublereal *vsl, + integer *ldvsl, doublereal *vsr, integer *ldvsr, doublereal *work, + integer *lwork, integer *info); + +/* Subroutine */ int dgegv_(char *jobvl, char *jobvr, integer *n, doublereal * + a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, + doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, + doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dgehd2_(integer *n, integer *ilo, integer *ihi, + doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *info); + +/* Subroutine */ int dgehrd_(integer *n, integer *ilo, integer *ihi, + doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info); + +/* Subroutine */ int dgelq2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dgelqf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgels_(char *trans, integer *m, integer *n, integer * + nrhs, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgelsd_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, + integer *iwork, integer *info); + +/* Subroutine */ int dgelss_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + s, doublereal *rcond, integer *rank, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dgelsx_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * + info); + +/* Subroutine */ int dgelsy_(integer *m, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + jpvt, doublereal *rcond, integer *rank, doublereal *work, integer * + lwork, integer *info); + +/* Subroutine */ int dgeql2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dgeqlf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgeqp3_(integer *m, integer *n, doublereal *a, integer * + lda, integer *jpvt, doublereal *tau, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dgeqpf_(integer *m, integer *n, doublereal *a, integer * + lda, integer *jpvt, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dgeqr2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dgeqrf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgerfs_(char *trans, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * + ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, + doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dgerq2_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dgerqf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgesc2_(integer *n, doublereal *a, integer *lda, + doublereal *rhs, integer *ipiv, integer *jpiv, doublereal *scale); + +/* Subroutine */ int dgesdd_(char *jobz, integer *m, integer *n, doublereal * + a, integer *lda, doublereal *s, doublereal *u, integer *ldu, + doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, + integer *iwork, integer *info); + +/* Subroutine */ int dgesv_(integer *n, integer *nrhs, doublereal *a, integer + *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dgesvd_(char *jobu, char *jobvt, integer *m, integer *n, + doublereal *a, integer *lda, doublereal *s, doublereal *u, integer * + ldu, doublereal *vt, integer *ldvt, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dgesvx_(char *fact, char *trans, integer *n, integer * + nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, + integer *ipiv, char *equed, doublereal *r__, doublereal *c__, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dgetc2_(integer *n, doublereal *a, integer *lda, integer + *ipiv, integer *jpiv, integer *info); + +/* Subroutine */ int dgetf2_(integer *m, integer *n, doublereal *a, integer * + lda, integer *ipiv, integer *info); + +/* Subroutine */ int dgetrf_(integer *m, integer *n, doublereal *a, integer * + lda, integer *ipiv, integer *info); + +/* Subroutine */ int dgetri_(integer *n, doublereal *a, integer *lda, integer + *ipiv, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dgetrs_(char *trans, integer *n, integer *nrhs, + doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * + ldb, integer *info); + +/* Subroutine */ int dggbak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, + doublereal *v, integer *ldv, integer *info); + +/* Subroutine */ int dggbal_(char *job, integer *n, doublereal *a, integer * + lda, doublereal *b, integer *ldb, integer *ilo, integer *ihi, + doublereal *lscale, doublereal *rscale, doublereal *work, integer * + info); + +/* Subroutine */ int dgges_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, integer *n, doublereal *a, integer *lda, doublereal *b, + integer *ldb, integer *sdim, doublereal *alphar, doublereal *alphai, + doublereal *beta, doublereal *vsl, integer *ldvsl, doublereal *vsr, + integer *ldvsr, doublereal *work, integer *lwork, logical *bwork, + integer *info); + +/* Subroutine */ int dggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, char *sense, integer *n, doublereal *a, integer *lda, + doublereal *b, integer *ldb, integer *sdim, doublereal *alphar, + doublereal *alphai, doublereal *beta, doublereal *vsl, integer *ldvsl, + doublereal *vsr, integer *ldvsr, doublereal *rconde, doublereal * + rcondv, doublereal *work, integer *lwork, integer *iwork, integer * + liwork, logical *bwork, integer *info); + +/* Subroutine */ int dggev_(char *jobvl, char *jobvr, integer *n, doublereal * + a, integer *lda, doublereal *b, integer *ldb, doublereal *alphar, + doublereal *alphai, doublereal *beta, doublereal *vl, integer *ldvl, + doublereal *vr, integer *ldvr, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dggevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * + beta, doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, + integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, + doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * + rcondv, doublereal *work, integer *lwork, integer *iwork, logical * + bwork, integer *info); + +/* Subroutine */ int dggglm_(integer *n, integer *m, integer *p, doublereal * + a, integer *lda, doublereal *b, integer *ldb, doublereal *d__, + doublereal *x, doublereal *y, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dgghrd_(char *compq, char *compz, integer *n, integer * + ilo, integer *ihi, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *q, integer *ldq, doublereal *z__, integer * + ldz, integer *info); + +/* Subroutine */ int dgglse_(integer *m, integer *n, integer *p, doublereal * + a, integer *lda, doublereal *b, integer *ldb, doublereal *c__, + doublereal *d__, doublereal *x, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dggqrf_(integer *n, integer *m, integer *p, doublereal * + a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, + doublereal *taub, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dggrqf_(integer *m, integer *p, integer *n, doublereal * + a, integer *lda, doublereal *taua, doublereal *b, integer *ldb, + doublereal *taub, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dggsvd_(char *jobu, char *jobv, char *jobq, integer *m, + integer *n, integer *p, integer *k, integer *l, doublereal *a, + integer *lda, doublereal *b, integer *ldb, doublereal *alpha, + doublereal *beta, doublereal *u, integer *ldu, doublereal *v, integer + *ldv, doublereal *q, integer *ldq, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dggsvp_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *tola, doublereal *tolb, integer *k, integer + *l, doublereal *u, integer *ldu, doublereal *v, integer *ldv, + doublereal *q, integer *ldq, integer *iwork, doublereal *tau, + doublereal *work, integer *info); + +/* Subroutine */ int dgtcon_(char *norm, integer *n, doublereal *dl, + doublereal *d__, doublereal *du, doublereal *du2, integer *ipiv, + doublereal *anorm, doublereal *rcond, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dgtrfs_(char *trans, integer *n, integer *nrhs, + doublereal *dl, doublereal *d__, doublereal *du, doublereal *dlf, + doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + ferr, doublereal *berr, doublereal *work, integer *iwork, integer * + info); + +/* Subroutine */ int dgtsv_(integer *n, integer *nrhs, doublereal *dl, + doublereal *d__, doublereal *du, doublereal *b, integer *ldb, integer + *info); + +/* Subroutine */ int dgtsvx_(char *fact, char *trans, integer *n, integer * + nrhs, doublereal *dl, doublereal *d__, doublereal *du, doublereal * + dlf, doublereal *df, doublereal *duf, doublereal *du2, integer *ipiv, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dgttrf_(integer *n, doublereal *dl, doublereal *d__, + doublereal *du, doublereal *du2, integer *ipiv, integer *info); + +/* Subroutine */ int dgttrs_(char *trans, integer *n, integer *nrhs, + doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, + integer *ipiv, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dgtts2_(integer *itrans, integer *n, integer *nrhs, + doublereal *dl, doublereal *d__, doublereal *du, doublereal *du2, + integer *ipiv, doublereal *b, integer *ldb); + +/* Subroutine */ int dhgeqz_(char *job, char *compq, char *compz, integer *n, + integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal + *t, integer *ldt, doublereal *alphar, doublereal *alphai, doublereal * + beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, + doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dhsein_(char *side, char *eigsrc, char *initv, logical * + select, integer *n, doublereal *h__, integer *ldh, doublereal *wr, + doublereal *wi, doublereal *vl, integer *ldvl, doublereal *vr, + integer *ldvr, integer *mm, integer *m, doublereal *work, integer * + ifaill, integer *ifailr, integer *info); + +/* Subroutine */ int dhseqr_(char *job, char *compz, integer *n, integer *ilo, + integer *ihi, doublereal *h__, integer *ldh, doublereal *wr, + doublereal *wi, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *info); + +/* Subroutine */ int dlabad_(doublereal *small, doublereal *large); + +/* Subroutine */ int dlabrd_(integer *m, integer *n, integer *nb, doublereal * + a, integer *lda, doublereal *d__, doublereal *e, doublereal *tauq, + doublereal *taup, doublereal *x, integer *ldx, doublereal *y, integer + *ldy); + +/* Subroutine */ int dlacn2_(integer *n, doublereal *v, doublereal *x, + integer *isgn, doublereal *est, integer *kase, integer *isave); + +/* Subroutine */ int dlacon_(integer *n, doublereal *v, doublereal *x, + integer *isgn, doublereal *est, integer *kase); + +/* Subroutine */ int dlacpy_(char *uplo, integer *m, integer *n, doublereal * + a, integer *lda, doublereal *b, integer *ldb); + +/* Subroutine */ int dladiv_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *d__, doublereal *p, doublereal *q); + +/* Subroutine */ int dlae2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *rt1, doublereal *rt2); + +/* Subroutine */ int dlaebz_(integer *ijob, integer *nitmax, integer *n, + integer *mmax, integer *minp, integer *nbmin, doublereal *abstol, + doublereal *reltol, doublereal *pivmin, doublereal *d__, doublereal * + e, doublereal *e2, integer *nval, doublereal *ab, doublereal *c__, + integer *mout, integer *nab, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dlaed0_(integer *icompq, integer *qsiz, integer *n, + doublereal *d__, doublereal *e, doublereal *q, integer *ldq, + doublereal *qstore, integer *ldqs, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dlaed1_(integer *n, doublereal *d__, doublereal *q, + integer *ldq, integer *indxq, doublereal *rho, integer *cutpnt, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dlaed2_(integer *k, integer *n, integer *n1, doublereal * + d__, doublereal *q, integer *ldq, integer *indxq, doublereal *rho, + doublereal *z__, doublereal *dlamda, doublereal *w, doublereal *q2, + integer *indx, integer *indxc, integer *indxp, integer *coltyp, + integer *info); + +/* Subroutine */ int dlaed3_(integer *k, integer *n, integer *n1, doublereal * + d__, doublereal *q, integer *ldq, doublereal *rho, doublereal *dlamda, + doublereal *q2, integer *indx, integer *ctot, doublereal *w, + doublereal *s, integer *info); + +/* Subroutine */ int dlaed4_(integer *n, integer *i__, doublereal *d__, + doublereal *z__, doublereal *delta, doublereal *rho, doublereal *dlam, + integer *info); + +/* Subroutine */ int dlaed5_(integer *i__, doublereal *d__, doublereal *z__, + doublereal *delta, doublereal *rho, doublereal *dlam); + +/* Subroutine */ int dlaed6_(integer *kniter, logical *orgati, doublereal * + rho, doublereal *d__, doublereal *z__, doublereal *finit, doublereal * + tau, integer *info); + +/* Subroutine */ int dlaed7_(integer *icompq, integer *n, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, + doublereal *q, integer *ldq, integer *indxq, doublereal *rho, integer + *cutpnt, doublereal *qstore, integer *qptr, integer *prmptr, integer * + perm, integer *givptr, integer *givcol, doublereal *givnum, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dlaed8_(integer *icompq, integer *k, integer *n, integer + *qsiz, doublereal *d__, doublereal *q, integer *ldq, integer *indxq, + doublereal *rho, integer *cutpnt, doublereal *z__, doublereal *dlamda, + doublereal *q2, integer *ldq2, doublereal *w, integer *perm, integer + *givptr, integer *givcol, doublereal *givnum, integer *indxp, integer + *indx, integer *info); + +/* Subroutine */ int dlaed9_(integer *k, integer *kstart, integer *kstop, + integer *n, doublereal *d__, doublereal *q, integer *ldq, doublereal * + rho, doublereal *dlamda, doublereal *w, doublereal *s, integer *lds, + integer *info); + +/* Subroutine */ int dlaeda_(integer *n, integer *tlvls, integer *curlvl, + integer *curpbm, integer *prmptr, integer *perm, integer *givptr, + integer *givcol, doublereal *givnum, doublereal *q, integer *qptr, + doublereal *z__, doublereal *ztemp, integer *info); + +/* Subroutine */ int dlaein_(logical *rightv, logical *noinit, integer *n, + doublereal *h__, integer *ldh, doublereal *wr, doublereal *wi, + doublereal *vr, doublereal *vi, doublereal *b, integer *ldb, + doublereal *work, doublereal *eps3, doublereal *smlnum, doublereal * + bignum, integer *info); + +/* Subroutine */ int dlaev2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *rt1, doublereal *rt2, doublereal *cs1, doublereal *sn1); + +/* Subroutine */ int dlaexc_(logical *wantq, integer *n, doublereal *t, + integer *ldt, doublereal *q, integer *ldq, integer *j1, integer *n1, + integer *n2, doublereal *work, integer *info); + +/* Subroutine */ int dlag2_(doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *safmin, doublereal *scale1, doublereal * + scale2, doublereal *wr1, doublereal *wr2, doublereal *wi); + +/* Subroutine */ int dlag2s_(integer *m, integer *n, doublereal *a, integer * + lda, real *sa, integer *ldsa, integer *info); + +/* Subroutine */ int dlags2_(logical *upper, doublereal *a1, doublereal *a2, + doublereal *a3, doublereal *b1, doublereal *b2, doublereal *b3, + doublereal *csu, doublereal *snu, doublereal *csv, doublereal *snv, + doublereal *csq, doublereal *snq); + +/* Subroutine */ int dlagtf_(integer *n, doublereal *a, doublereal *lambda, + doublereal *b, doublereal *c__, doublereal *tol, doublereal *d__, + integer *in, integer *info); + +/* Subroutine */ int dlagtm_(char *trans, integer *n, integer *nrhs, + doublereal *alpha, doublereal *dl, doublereal *d__, doublereal *du, + doublereal *x, integer *ldx, doublereal *beta, doublereal *b, integer + *ldb); + +/* Subroutine */ int dlagts_(integer *job, integer *n, doublereal *a, + doublereal *b, doublereal *c__, doublereal *d__, integer *in, + doublereal *y, doublereal *tol, integer *info); + +/* Subroutine */ int dlagv2_(doublereal *a, integer *lda, doublereal *b, + integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * + beta, doublereal *csl, doublereal *snl, doublereal *csr, doublereal * + snr); + +/* Subroutine */ int dlahqr_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal + *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, + integer *ldz, integer *info); + +/* Subroutine */ int dlahr2_(integer *n, integer *k, integer *nb, doublereal * + a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, + doublereal *y, integer *ldy); + +/* Subroutine */ int dlahrd_(integer *n, integer *k, integer *nb, doublereal * + a, integer *lda, doublereal *tau, doublereal *t, integer *ldt, + doublereal *y, integer *ldy); + +/* Subroutine */ int dlaic1_(integer *job, integer *j, doublereal *x, + doublereal *sest, doublereal *w, doublereal *gamma, doublereal * + sestpr, doublereal *s, doublereal *c__); + +/* Subroutine */ int dlaln2_(logical *ltrans, integer *na, integer *nw, + doublereal *smin, doublereal *ca, doublereal *a, integer *lda, + doublereal *d1, doublereal *d2, doublereal *b, integer *ldb, + doublereal *wr, doublereal *wi, doublereal *x, integer *ldx, + doublereal *scale, doublereal *xnorm, integer *info); + +/* Subroutine */ int dlals0_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *nrhs, doublereal *b, integer *ldb, doublereal + *bx, integer *ldbx, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, doublereal *givnum, integer *ldgnum, doublereal * + poles, doublereal *difl, doublereal *difr, doublereal *z__, integer * + k, doublereal *c__, doublereal *s, doublereal *work, integer *info); + +/* Subroutine */ int dlalsa_(integer *icompq, integer *smlsiz, integer *n, + integer *nrhs, doublereal *b, integer *ldb, doublereal *bx, integer * + ldbx, doublereal *u, integer *ldu, doublereal *vt, integer *k, + doublereal *difl, doublereal *difr, doublereal *z__, doublereal * + poles, integer *givptr, integer *givcol, integer *ldgcol, integer * + perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * + work, integer *iwork, integer *info); + +/* Subroutine */ int dlalsd_(char *uplo, integer *smlsiz, integer *n, integer + *nrhs, doublereal *d__, doublereal *e, doublereal *b, integer *ldb, + doublereal *rcond, integer *rank, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dlamrg_(integer *n1, integer *n2, doublereal *a, integer + *dtrd1, integer *dtrd2, integer *index); + +/* Subroutine */ int dlanv2_(doublereal *a, doublereal *b, doublereal *c__, + doublereal *d__, doublereal *rt1r, doublereal *rt1i, doublereal *rt2r, + doublereal *rt2i, doublereal *cs, doublereal *sn); + +/* Subroutine */ int dlapll_(integer *n, doublereal *x, integer *incx, + doublereal *y, integer *incy, doublereal *ssmin); + +/* Subroutine */ int dlapmt_(logical *forwrd, integer *m, integer *n, + doublereal *x, integer *ldx, integer *k); + +/* Subroutine */ int dlaqgb_(integer *m, integer *n, integer *kl, integer *ku, + doublereal *ab, integer *ldab, doublereal *r__, doublereal *c__, + doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); + +/* Subroutine */ int dlaqge_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, doublereal + *colcnd, doublereal *amax, char *equed); + +/* Subroutine */ int dlaqp2_(integer *m, integer *n, integer *offset, + doublereal *a, integer *lda, integer *jpvt, doublereal *tau, + doublereal *vn1, doublereal *vn2, doublereal *work); + +/* Subroutine */ int dlaqps_(integer *m, integer *n, integer *offset, integer + *nb, integer *kb, doublereal *a, integer *lda, integer *jpvt, + doublereal *tau, doublereal *vn1, doublereal *vn2, doublereal *auxv, + doublereal *f, integer *ldf); + +/* Subroutine */ int dlaqr0_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal + *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, + integer *ldz, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dlaqr1_(integer *n, doublereal *h__, integer *ldh, + doublereal *sr1, doublereal *si1, doublereal *sr2, doublereal *si2, + doublereal *v); + +/* Subroutine */ int dlaqr2_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * + ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, + integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * + v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * + nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork); + +/* Subroutine */ int dlaqr3_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, doublereal *h__, integer * + ldh, integer *iloz, integer *ihiz, doublereal *z__, integer *ldz, + integer *ns, integer *nd, doublereal *sr, doublereal *si, doublereal * + v, integer *ldv, integer *nh, doublereal *t, integer *ldt, integer * + nv, doublereal *wv, integer *ldwv, doublereal *work, integer *lwork); + +/* Subroutine */ int dlaqr4_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, doublereal *h__, integer *ldh, doublereal + *wr, doublereal *wi, integer *iloz, integer *ihiz, doublereal *z__, + integer *ldz, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dlaqr5_(logical *wantt, logical *wantz, integer *kacc22, + integer *n, integer *ktop, integer *kbot, integer *nshfts, doublereal + *sr, doublereal *si, doublereal *h__, integer *ldh, integer *iloz, + integer *ihiz, doublereal *z__, integer *ldz, doublereal *v, integer * + ldv, doublereal *u, integer *ldu, integer *nv, doublereal *wv, + integer *ldwv, integer *nh, doublereal *wh, integer *ldwh); + +/* Subroutine */ int dlaqsb_(char *uplo, integer *n, integer *kd, doublereal * + ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, + char *equed); + +/* Subroutine */ int dlaqsp_(char *uplo, integer *n, doublereal *ap, + doublereal *s, doublereal *scond, doublereal *amax, char *equed); + +/* Subroutine */ int dlaqsy_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *s, doublereal *scond, doublereal *amax, char *equed); + +/* Subroutine */ int dlaqtr_(logical *ltran, logical *lreal, integer *n, + doublereal *t, integer *ldt, doublereal *b, doublereal *w, doublereal + *scale, doublereal *x, doublereal *work, integer *info); + +/* Subroutine */ int dlar1v_(integer *n, integer *b1, integer *bn, doublereal + *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * + lld, doublereal *pivmin, doublereal *gaptol, doublereal *z__, logical + *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, + integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, + doublereal *rqcorr, doublereal *work); + +/* Subroutine */ int dlar2v_(integer *n, doublereal *x, doublereal *y, + doublereal *z__, integer *incx, doublereal *c__, doublereal *s, + integer *incc); + +/* Subroutine */ int dlarf_(char *side, integer *m, integer *n, doublereal *v, + integer *incv, doublereal *tau, doublereal *c__, integer *ldc, + doublereal *work); + +/* Subroutine */ int dlarfb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, doublereal *v, integer * + ldv, doublereal *t, integer *ldt, doublereal *c__, integer *ldc, + doublereal *work, integer *ldwork); + +/* Subroutine */ int dlarfg_(integer *n, doublereal *alpha, doublereal *x, + integer *incx, doublereal *tau); + +/* Subroutine */ int dlarft_(char *direct, char *storev, integer *n, integer * + k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, + integer *ldt); + +/* Subroutine */ int dlarfx_(char *side, integer *m, integer *n, doublereal * + v, doublereal *tau, doublereal *c__, integer *ldc, doublereal *work); + +/* Subroutine */ int dlargv_(integer *n, doublereal *x, integer *incx, + doublereal *y, integer *incy, doublereal *c__, integer *incc); + +/* Subroutine */ int dlarnv_(integer *idist, integer *iseed, integer *n, + doublereal *x); + +/* Subroutine */ int dlarra_(integer *n, doublereal *d__, doublereal *e, + doublereal *e2, doublereal *spltol, doublereal *tnrm, integer *nsplit, + integer *isplit, integer *info); + +/* Subroutine */ int dlarrb_(integer *n, doublereal *d__, doublereal *lld, + integer *ifirst, integer *ilast, doublereal *rtol1, doublereal *rtol2, + integer *offset, doublereal *w, doublereal *wgap, doublereal *werr, + doublereal *work, integer *iwork, doublereal *pivmin, doublereal * + spdiam, integer *twist, integer *info); + +/* Subroutine */ int dlarrc_(char *jobt, integer *n, doublereal *vl, + doublereal *vu, doublereal *d__, doublereal *e, doublereal *pivmin, + integer *eigcnt, integer *lcnt, integer *rcnt, integer *info); + +/* Subroutine */ int dlarrd_(char *range, char *order, integer *n, doublereal + *vl, doublereal *vu, integer *il, integer *iu, doublereal *gers, + doublereal *reltol, doublereal *d__, doublereal *e, doublereal *e2, + doublereal *pivmin, integer *nsplit, integer *isplit, integer *m, + doublereal *w, doublereal *werr, doublereal *wl, doublereal *wu, + integer *iblock, integer *indexw, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dlarre_(char *range, integer *n, doublereal *vl, + doublereal *vu, integer *il, integer *iu, doublereal *d__, doublereal + *e, doublereal *e2, doublereal *rtol1, doublereal *rtol2, doublereal * + spltol, integer *nsplit, integer *isplit, integer *m, doublereal *w, + doublereal *werr, doublereal *wgap, integer *iblock, integer *indexw, + doublereal *gers, doublereal *pivmin, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dlarrf_(integer *n, doublereal *d__, doublereal *l, + doublereal *ld, integer *clstrt, integer *clend, doublereal *w, + doublereal *wgap, doublereal *werr, doublereal *spdiam, doublereal * + clgapl, doublereal *clgapr, doublereal *pivmin, doublereal *sigma, + doublereal *dplus, doublereal *lplus, doublereal *work, integer *info); + +/* Subroutine */ int dlarrj_(integer *n, doublereal *d__, doublereal *e2, + integer *ifirst, integer *ilast, doublereal *rtol, integer *offset, + doublereal *w, doublereal *werr, doublereal *work, integer *iwork, + doublereal *pivmin, doublereal *spdiam, integer *info); + +/* Subroutine */ int dlarrk_(integer *n, integer *iw, doublereal *gl, + doublereal *gu, doublereal *d__, doublereal *e2, doublereal *pivmin, + doublereal *reltol, doublereal *w, doublereal *werr, integer *info); + +/* Subroutine */ int dlarrr_(integer *n, doublereal *d__, doublereal *e, + integer *info); + +/* Subroutine */ int dlarrv_(integer *n, doublereal *vl, doublereal *vu, + doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, + integer *m, integer *dol, integer *dou, doublereal *minrgp, + doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, + doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, + doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, + integer *iwork, integer *info); + +/* Subroutine */ int dlartg_(doublereal *f, doublereal *g, doublereal *cs, + doublereal *sn, doublereal *r__); + +/* Subroutine */ int dlartv_(integer *n, doublereal *x, integer *incx, + doublereal *y, integer *incy, doublereal *c__, doublereal *s, integer + *incc); + +/* Subroutine */ int dlaruv_(integer *iseed, integer *n, doublereal *x); + +/* Subroutine */ int dlarz_(char *side, integer *m, integer *n, integer *l, + doublereal *v, integer *incv, doublereal *tau, doublereal *c__, + integer *ldc, doublereal *work); + +/* Subroutine */ int dlarzb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, integer *l, doublereal *v, + integer *ldv, doublereal *t, integer *ldt, doublereal *c__, integer * + ldc, doublereal *work, integer *ldwork ); + +/* Subroutine */ int dlarzt_(char *direct, char *storev, integer *n, integer * + k, doublereal *v, integer *ldv, doublereal *tau, doublereal *t, + integer *ldt); + +/* Subroutine */ int dlas2_(doublereal *f, doublereal *g, doublereal *h__, + doublereal *ssmin, doublereal *ssmax); + +/* Subroutine */ int dlascl_(char *type__, integer *kl, integer *ku, + doublereal *cfrom, doublereal *cto, integer *m, integer *n, + doublereal *a, integer *lda, integer *info); + +/* Subroutine */ int dlasd0_(integer *n, integer *sqre, doublereal *d__, + doublereal *e, doublereal *u, integer *ldu, doublereal *vt, integer * + ldvt, integer *smlsiz, integer *iwork, doublereal *work, integer * + info); + +/* Subroutine */ int dlasd1_(integer *nl, integer *nr, integer *sqre, + doublereal *d__, doublereal *alpha, doublereal *beta, doublereal *u, + integer *ldu, doublereal *vt, integer *ldvt, integer *idxq, integer * + iwork, doublereal *work, integer *info); + +/* Subroutine */ int dlasd2_(integer *nl, integer *nr, integer *sqre, integer + *k, doublereal *d__, doublereal *z__, doublereal *alpha, doublereal * + beta, doublereal *u, integer *ldu, doublereal *vt, integer *ldvt, + doublereal *dsigma, doublereal *u2, integer *ldu2, doublereal *vt2, + integer *ldvt2, integer *idxp, integer *idx, integer *idxc, integer * + idxq, integer *coltyp, integer *info); + +/* Subroutine */ int dlasd3_(integer *nl, integer *nr, integer *sqre, integer + *k, doublereal *d__, doublereal *q, integer *ldq, doublereal *dsigma, + doublereal *u, integer *ldu, doublereal *u2, integer *ldu2, + doublereal *vt, integer *ldvt, doublereal *vt2, integer *ldvt2, + integer *idxc, integer *ctot, doublereal *z__, integer *info); + +/* Subroutine */ int dlasd4_(integer *n, integer *i__, doublereal *d__, + doublereal *z__, doublereal *delta, doublereal *rho, doublereal * + sigma, doublereal *work, integer *info); + +/* Subroutine */ int dlasd5_(integer *i__, doublereal *d__, doublereal *z__, + doublereal *delta, doublereal *rho, doublereal *dsigma, doublereal * + work); + +/* Subroutine */ int dlasd6_(integer *icompq, integer *nl, integer *nr, + integer *sqre, doublereal *d__, doublereal *vf, doublereal *vl, + doublereal *alpha, doublereal *beta, integer *idxq, integer *perm, + integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *poles, doublereal *difl, doublereal * + difr, doublereal *z__, integer *k, doublereal *c__, doublereal *s, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dlasd7_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *k, doublereal *d__, doublereal *z__, + doublereal *zw, doublereal *vf, doublereal *vfw, doublereal *vl, + doublereal *vlw, doublereal *alpha, doublereal *beta, doublereal * + dsigma, integer *idx, integer *idxp, integer *idxq, integer *perm, + integer *givptr, integer *givcol, integer *ldgcol, doublereal *givnum, + integer *ldgnum, doublereal *c__, doublereal *s, integer *info); + +/* Subroutine */ int dlasd8_(integer *icompq, integer *k, doublereal *d__, + doublereal *z__, doublereal *vf, doublereal *vl, doublereal *difl, + doublereal *difr, integer *lddifr, doublereal *dsigma, doublereal * + work, integer *info); + +/* Subroutine */ int dlasda_(integer *icompq, integer *smlsiz, integer *n, + integer *sqre, doublereal *d__, doublereal *e, doublereal *u, integer + *ldu, doublereal *vt, integer *k, doublereal *difl, doublereal *difr, + doublereal *z__, doublereal *poles, integer *givptr, integer *givcol, + integer *ldgcol, integer *perm, doublereal *givnum, doublereal *c__, + doublereal *s, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dlasdq_(char *uplo, integer *sqre, integer *n, integer * + ncvt, integer *nru, integer *ncc, doublereal *d__, doublereal *e, + doublereal *vt, integer *ldvt, doublereal *u, integer *ldu, + doublereal *c__, integer *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dlasdt_(integer *n, integer *lvl, integer *nd, integer * + inode, integer *ndiml, integer *ndimr, integer *msub); + +/* Subroutine */ int dlaset_(char *uplo, integer *m, integer *n, doublereal * + alpha, doublereal *beta, doublereal *a, integer *lda); + +/* Subroutine */ int dlasq1_(integer *n, doublereal *d__, doublereal *e, + doublereal *work, integer *info); + +/* Subroutine */ int dlasq2_(integer *n, doublereal *z__, integer *info); + +/* Subroutine */ int dlasq3_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, + doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, + logical *ieee); + +/* Subroutine */ int dlasq4_(integer *i0, integer *n0, doublereal *z__, + integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, + doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, + doublereal *tau, integer *ttype); + +/* Subroutine */ int dlasq5_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *tau, doublereal *dmin__, doublereal *dmin1, + doublereal *dmin2, doublereal *dn, doublereal *dnm1, doublereal *dnm2, + logical *ieee); + +/* Subroutine */ int dlasq6_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dnm1, doublereal *dnm2); + +/* Subroutine */ int dlasr_(char *side, char *pivot, char *direct, integer *m, + integer *n, doublereal *c__, doublereal *s, doublereal *a, integer * + lda); + +/* Subroutine */ int dlasrt_(char *id, integer *n, doublereal *d__, integer * + info); + +/* Subroutine */ int dlassq_(integer *n, doublereal *x, integer *incx, + doublereal *scale, doublereal *sumsq); + +/* Subroutine */ int dlasv2_(doublereal *f, doublereal *g, doublereal *h__, + doublereal *ssmin, doublereal *ssmax, doublereal *snr, doublereal * + csr, doublereal *snl, doublereal *csl); + +/* Subroutine */ int dlaswp_(integer *n, doublereal *a, integer *lda, integer + *k1, integer *k2, integer *ipiv, integer *incx); + +/* Subroutine */ int dlasy2_(logical *ltranl, logical *ltranr, integer *isgn, + integer *n1, integer *n2, doublereal *tl, integer *ldtl, doublereal * + tr, integer *ldtr, doublereal *b, integer *ldb, doublereal *scale, + doublereal *x, integer *ldx, doublereal *xnorm, integer *info); + +/* Subroutine */ int dlasyf_(char *uplo, integer *n, integer *nb, integer *kb, + doublereal *a, integer *lda, integer *ipiv, doublereal *w, integer * + ldw, integer *info); + +/* Subroutine */ int dlatbs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, integer *kd, doublereal *ab, integer *ldab, + doublereal *x, doublereal *scale, doublereal *cnorm, integer *info); + +/* Subroutine */ int dlatdf_(integer *ijob, integer *n, doublereal *z__, + integer *ldz, doublereal *rhs, doublereal *rdsum, doublereal *rdscal, + integer *ipiv, integer *jpiv); + +/* Subroutine */ int dlatps_(char *uplo, char *trans, char *diag, char * + normin, integer *n, doublereal *ap, doublereal *x, doublereal *scale, + doublereal *cnorm, integer *info); + +/* Subroutine */ int dlatrd_(char *uplo, integer *n, integer *nb, doublereal * + a, integer *lda, doublereal *e, doublereal *tau, doublereal *w, + integer *ldw); + +/* Subroutine */ int dlatrs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, doublereal *a, integer *lda, doublereal *x, + doublereal *scale, doublereal *cnorm, integer *info); + +/* Subroutine */ int dlatrz_(integer *m, integer *n, integer *l, doublereal * + a, integer *lda, doublereal *tau, doublereal *work); + +/* Subroutine */ int dlatzm_(char *side, integer *m, integer *n, doublereal * + v, integer *incv, doublereal *tau, doublereal *c1, doublereal *c2, + integer *ldc, doublereal *work); + +/* Subroutine */ int dlauu2_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info); + +/* Subroutine */ int dlauum_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info); + +/* Subroutine */ int dlazq3_(integer *i0, integer *n0, doublereal *z__, + integer *pp, doublereal *dmin__, doublereal *sigma, doublereal *desig, + doublereal *qmax, integer *nfail, integer *iter, integer *ndiv, + logical *ieee, integer *ttype, doublereal *dmin1, doublereal *dmin2, + doublereal *dn, doublereal *dn1, doublereal *dn2, doublereal *tau); + +/* Subroutine */ int dlazq4_(integer *i0, integer *n0, doublereal *z__, + integer *pp, integer *n0in, doublereal *dmin__, doublereal *dmin1, + doublereal *dmin2, doublereal *dn, doublereal *dn1, doublereal *dn2, + doublereal *tau, integer *ttype, doublereal *g); + +/* Subroutine */ int dopgtr_(char *uplo, integer *n, doublereal *ap, + doublereal *tau, doublereal *q, integer *ldq, doublereal *work, + integer *info); + +/* Subroutine */ int dopmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublereal *ap, doublereal *tau, doublereal *c__, integer + *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dorg2l_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dorg2r_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dorgbr_(char *vect, integer *m, integer *n, integer *k, + doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info); + +/* Subroutine */ int dorghr_(integer *n, integer *ilo, integer *ihi, + doublereal *a, integer *lda, doublereal *tau, doublereal *work, + integer *lwork, integer *info); + +/* Subroutine */ int dorgl2_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dorglq_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dorgql_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dorgqr_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dorgr2_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *info); + +/* Subroutine */ int dorgrq_(integer *m, integer *n, integer *k, doublereal * + a, integer *lda, doublereal *tau, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dorgtr_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dorm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dorm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dormbr_(char *vect, char *side, char *trans, integer *m, + integer *n, integer *k, doublereal *a, integer *lda, doublereal *tau, + doublereal *c__, integer *ldc, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dormhr_(char *side, char *trans, integer *m, integer *n, + integer *ilo, integer *ihi, doublereal *a, integer *lda, doublereal * + tau, doublereal *c__, integer *ldc, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dorml2_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dormlq_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dormql_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dormqr_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dormr2_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dormr3_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, + doublereal *c__, integer *ldc, doublereal *work, integer *info); + +/* Subroutine */ int dormrq_(char *side, char *trans, integer *m, integer *n, + integer *k, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dormrz_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, doublereal *a, integer *lda, doublereal *tau, + doublereal *c__, integer *ldc, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dormtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublereal *a, integer *lda, doublereal *tau, doublereal * + c__, integer *ldc, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dpbcon_(char *uplo, integer *n, integer *kd, doublereal * + ab, integer *ldab, doublereal *anorm, doublereal *rcond, doublereal * + work, integer *iwork, integer *info); + +/* Subroutine */ int dpbequ_(char *uplo, integer *n, integer *kd, doublereal * + ab, integer *ldab, doublereal *s, doublereal *scond, doublereal *amax, + integer *info); + +/* Subroutine */ int dpbrfs_(char *uplo, integer *n, integer *kd, integer * + nrhs, doublereal *ab, integer *ldab, doublereal *afb, integer *ldafb, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + ferr, doublereal *berr, doublereal *work, integer *iwork, integer * + info); + +/* Subroutine */ int dpbstf_(char *uplo, integer *n, integer *kd, doublereal * + ab, integer *ldab, integer *info); + +/* Subroutine */ int dpbsv_(char *uplo, integer *n, integer *kd, integer * + nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, + integer *info); + +/* Subroutine */ int dpbsvx_(char *fact, char *uplo, integer *n, integer *kd, + integer *nrhs, doublereal *ab, integer *ldab, doublereal *afb, + integer *ldafb, char *equed, doublereal *s, doublereal *b, integer * + ldb, doublereal *x, integer *ldx, doublereal *rcond, doublereal *ferr, + doublereal *berr, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dpbtf2_(char *uplo, integer *n, integer *kd, doublereal * + ab, integer *ldab, integer *info); + +/* Subroutine */ int dpbtrf_(char *uplo, integer *n, integer *kd, doublereal * + ab, integer *ldab, integer *info); + +/* Subroutine */ int dpbtrs_(char *uplo, integer *n, integer *kd, integer * + nrhs, doublereal *ab, integer *ldab, doublereal *b, integer *ldb, + integer *info); + +/* Subroutine */ int dpocon_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *anorm, doublereal *rcond, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dpoequ_(integer *n, doublereal *a, integer *lda, + doublereal *s, doublereal *scond, doublereal *amax, integer *info); + +/* Subroutine */ int dporfs_(char *uplo, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *af, integer *ldaf, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + ferr, doublereal *berr, doublereal *work, integer *iwork, integer * + info); + +/* Subroutine */ int dposv_(char *uplo, integer *n, integer *nrhs, doublereal + *a, integer *lda, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dposvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, + char *equed, doublereal *s, doublereal *b, integer *ldb, doublereal * + x, integer *ldx, doublereal *rcond, doublereal *ferr, doublereal * + berr, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dpotf2_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info); + +/* Subroutine */ int dpotrf_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info); + +/* Subroutine */ int dpotri_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *info); + +/* Subroutine */ int dpotrs_(char *uplo, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info); + +/* Subroutine */ int dppcon_(char *uplo, integer *n, doublereal *ap, + doublereal *anorm, doublereal *rcond, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dppequ_(char *uplo, integer *n, doublereal *ap, + doublereal *s, doublereal *scond, doublereal *amax, integer *info); + +/* Subroutine */ int dpprfs_(char *uplo, integer *n, integer *nrhs, + doublereal *ap, doublereal *afp, doublereal *b, integer *ldb, + doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dppsv_(char *uplo, integer *n, integer *nrhs, doublereal + *ap, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dppsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublereal *ap, doublereal *afp, char *equed, doublereal *s, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * + iwork, integer *info); + +/* Subroutine */ int dpptrf_(char *uplo, integer *n, doublereal *ap, integer * + info); + +/* Subroutine */ int dpptri_(char *uplo, integer *n, doublereal *ap, integer * + info); + +/* Subroutine */ int dpptrs_(char *uplo, integer *n, integer *nrhs, + doublereal *ap, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dptcon_(integer *n, doublereal *d__, doublereal *e, + doublereal *anorm, doublereal *rcond, doublereal *work, integer *info); + +/* Subroutine */ int dpteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int dptrfs_(integer *n, integer *nrhs, doublereal *d__, + doublereal *e, doublereal *df, doublereal *ef, doublereal *b, integer + *ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublereal *work, integer *info); + +/* Subroutine */ int dptsv_(integer *n, integer *nrhs, doublereal *d__, + doublereal *e, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dptsvx_(char *fact, integer *n, integer *nrhs, + doublereal *d__, doublereal *e, doublereal *df, doublereal *ef, + doublereal *b, integer *ldb, doublereal *x, integer *ldx, doublereal * + rcond, doublereal *ferr, doublereal *berr, doublereal *work, integer * + info); + +/* Subroutine */ int dpttrf_(integer *n, doublereal *d__, doublereal *e, + integer *info); + +/* Subroutine */ int dpttrs_(integer *n, integer *nrhs, doublereal *d__, + doublereal *e, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dptts2_(integer *n, integer *nrhs, doublereal *d__, + doublereal *e, doublereal *b, integer *ldb); + +/* Subroutine */ int drscl_(integer *n, doublereal *sa, doublereal *sx, + integer *incx); + +/* Subroutine */ int dsbev_(char *jobz, char *uplo, integer *n, integer *kd, + doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *info); + +/* Subroutine */ int dsbevd_(char *jobz, char *uplo, integer *n, integer *kd, + doublereal *ab, integer *ldab, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *lwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int dsbevx_(char *jobz, char *range, char *uplo, integer *n, + integer *kd, doublereal *ab, integer *ldab, doublereal *q, integer * + ldq, doublereal *vl, doublereal *vu, integer *il, integer *iu, + doublereal *abstol, integer *m, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *iwork, integer *ifail, + integer *info); + +/* Subroutine */ int dsbgst_(char *vect, char *uplo, integer *n, integer *ka, + integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * + ldbb, doublereal *x, integer *ldx, doublereal *work, integer *info); + +/* Subroutine */ int dsbgv_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * + ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int dsbgvd_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, doublereal *ab, integer *ldab, doublereal *bb, integer * + ldbb, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dsbgvx_(char *jobz, char *range, char *uplo, integer *n, + integer *ka, integer *kb, doublereal *ab, integer *ldab, doublereal * + bb, integer *ldbb, doublereal *q, integer *ldq, doublereal *vl, + doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer + *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, + integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int dsbtrd_(char *vect, char *uplo, integer *n, integer *kd, + doublereal *ab, integer *ldab, doublereal *d__, doublereal *e, + doublereal *q, integer *ldq, doublereal *work, integer *info); + +/* Subroutine */ int dsgesv_(integer *n, integer *nrhs, doublereal *a, + integer *lda, integer *ipiv, doublereal *b, integer *ldb, doublereal * + x, integer *ldx, doublereal *work, real *swork, integer *iter, + integer *info); + +/* Subroutine */ int dspcon_(char *uplo, integer *n, doublereal *ap, integer * + ipiv, doublereal *anorm, doublereal *rcond, doublereal *work, integer + *iwork, integer *info); + +/* Subroutine */ int dspev_(char *jobz, char *uplo, integer *n, doublereal * + ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int dspevd_(char *jobz, char *uplo, integer *n, doublereal * + ap, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dspevx_(char *jobz, char *range, char *uplo, integer *n, + doublereal *ap, doublereal *vl, doublereal *vu, integer *il, integer * + iu, doublereal *abstol, integer *m, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *iwork, integer *ifail, + integer *info); + +/* Subroutine */ int dspgst_(integer *itype, char *uplo, integer *n, + doublereal *ap, doublereal *bp, integer *info); + +/* Subroutine */ int dspgv_(integer *itype, char *jobz, char *uplo, integer * + n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *info); + +/* Subroutine */ int dspgvd_(integer *itype, char *jobz, char *uplo, integer * + n, doublereal *ap, doublereal *bp, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *lwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int dspgvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, doublereal *ap, doublereal *bp, doublereal *vl, + doublereal *vu, integer *il, integer *iu, doublereal *abstol, integer + *m, doublereal *w, doublereal *z__, integer *ldz, doublereal *work, + integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int dsprfs_(char *uplo, integer *n, integer *nrhs, + doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, + integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, + doublereal *berr, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dspsv_(char *uplo, integer *n, integer *nrhs, doublereal + *ap, integer *ipiv, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int dspsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublereal *ap, doublereal *afp, integer *ipiv, doublereal *b, + integer *ldb, doublereal *x, integer *ldx, doublereal *rcond, + doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dsptrd_(char *uplo, integer *n, doublereal *ap, + doublereal *d__, doublereal *e, doublereal *tau, integer *info); + +/* Subroutine */ int dsptrf_(char *uplo, integer *n, doublereal *ap, integer * + ipiv, integer *info); + +/* Subroutine */ int dsptri_(char *uplo, integer *n, doublereal *ap, integer * + ipiv, doublereal *work, integer *info); + +/* Subroutine */ int dsptrs_(char *uplo, integer *n, integer *nrhs, + doublereal *ap, integer *ipiv, doublereal *b, integer *ldb, integer * + info); + +/* Subroutine */ int dstebz_(char *range, char *order, integer *n, doublereal + *vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, + doublereal *d__, doublereal *e, integer *m, integer *nsplit, + doublereal *w, integer *iblock, integer *isplit, doublereal *work, + integer *iwork, integer *info); + +/* Subroutine */ int dstedc_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dstegr_(char *jobz, char *range, integer *n, doublereal * + d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, + integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dstein_(integer *n, doublereal *d__, doublereal *e, + integer *m, doublereal *w, integer *iblock, integer *isplit, + doublereal *z__, integer *ldz, doublereal *work, integer *iwork, + integer *ifail, integer *info); + +/* Subroutine */ int dstemr_(char *jobz, char *range, integer *n, doublereal * + d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, + integer *iu, integer *m, doublereal *w, doublereal *z__, integer *ldz, + integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dsteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int dsterf_(integer *n, doublereal *d__, doublereal *e, + integer *info); + +/* Subroutine */ int dstev_(char *jobz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int dstevd_(char *jobz, integer *n, doublereal *d__, + doublereal *e, doublereal *z__, integer *ldz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dstevr_(char *jobz, char *range, integer *n, doublereal * + d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, + integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dstevx_(char *jobz, char *range, integer *n, doublereal * + d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, + integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublereal *z__, integer *ldz, doublereal *work, integer *iwork, + integer *ifail, integer *info); + +/* Subroutine */ int dsycon_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *ipiv, doublereal *anorm, doublereal *rcond, doublereal * + work, integer *iwork, integer *info); + +/* Subroutine */ int dsyev_(char *jobz, char *uplo, integer *n, doublereal *a, + integer *lda, doublereal *w, doublereal *work, integer *lwork, + integer *info); + +/* Subroutine */ int dsyevd_(char *jobz, char *uplo, integer *n, doublereal * + a, integer *lda, doublereal *w, doublereal *work, integer *lwork, + integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dsyevr_(char *jobz, char *range, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * + il, integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublereal *z__, integer *ldz, integer *isuppz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int dsyevx_(char *jobz, char *range, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *vl, doublereal *vu, integer * + il, integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublereal *z__, integer *ldz, doublereal *work, integer *lwork, + integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int dsygs2_(integer *itype, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info); + +/* Subroutine */ int dsygst_(integer *itype, char *uplo, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, integer * + info); + +/* Subroutine */ int dsygv_(integer *itype, char *jobz, char *uplo, integer * + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *w, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dsygvd_(integer *itype, char *jobz, char *uplo, integer * + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *w, doublereal *work, integer *lwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int dsygvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, doublereal *a, integer *lda, doublereal *b, integer + *ldb, doublereal *vl, doublereal *vu, integer *il, integer *iu, + doublereal *abstol, integer *m, doublereal *w, doublereal *z__, + integer *ldz, doublereal *work, integer *lwork, integer *iwork, + integer *ifail, integer *info); + +/* Subroutine */ int dsyrfs_(char *uplo, integer *n, integer *nrhs, + doublereal *a, integer *lda, doublereal *af, integer *ldaf, integer * + ipiv, doublereal *b, integer *ldb, doublereal *x, integer *ldx, + doublereal *ferr, doublereal *berr, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dsysv_(char *uplo, integer *n, integer *nrhs, doublereal + *a, integer *lda, integer *ipiv, doublereal *b, integer *ldb, + doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dsysvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublereal *a, integer *lda, doublereal *af, integer *ldaf, + integer *ipiv, doublereal *b, integer *ldb, doublereal *x, integer * + ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, + doublereal *work, integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int dsytd2_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tau, integer *info); + +/* Subroutine */ int dsytf2_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *ipiv, integer *info); + +/* Subroutine */ int dsytrd_(char *uplo, integer *n, doublereal *a, integer * + lda, doublereal *d__, doublereal *e, doublereal *tau, doublereal * + work, integer *lwork, integer *info); + +/* Subroutine */ int dsytrf_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *ipiv, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dsytri_(char *uplo, integer *n, doublereal *a, integer * + lda, integer *ipiv, doublereal *work, integer *info); + +/* Subroutine */ int dsytrs_(char *uplo, integer *n, integer *nrhs, + doublereal *a, integer *lda, integer *ipiv, doublereal *b, integer * + ldb, integer *info); + +/* Subroutine */ int dtbcon_(char *norm, char *uplo, char *diag, integer *n, + integer *kd, doublereal *ab, integer *ldab, doublereal *rcond, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dtbrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal + *b, integer *ldb, doublereal *x, integer *ldx, doublereal *ferr, + doublereal *berr, doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dtbtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, doublereal *ab, integer *ldab, doublereal + *b, integer *ldb, integer *info); + +/* Subroutine */ int dtgevc_(char *side, char *howmny, logical *select, + integer *n, doublereal *s, integer *lds, doublereal *p, integer *ldp, + doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, integer + *mm, integer *m, doublereal *work, integer *info); + +/* Subroutine */ int dtgex2_(logical *wantq, logical *wantz, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + q, integer *ldq, doublereal *z__, integer *ldz, integer *j1, integer * + n1, integer *n2, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dtgexc_(logical *wantq, logical *wantz, integer *n, + doublereal *a, integer *lda, doublereal *b, integer *ldb, doublereal * + q, integer *ldq, doublereal *z__, integer *ldz, integer *ifst, + integer *ilst, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int dtgsen_(integer *ijob, logical *wantq, logical *wantz, + logical *select, integer *n, doublereal *a, integer *lda, doublereal * + b, integer *ldb, doublereal *alphar, doublereal *alphai, doublereal * + beta, doublereal *q, integer *ldq, doublereal *z__, integer *ldz, + integer *m, doublereal *pl, doublereal *pr, doublereal *dif, + doublereal *work, integer *lwork, integer *iwork, integer *liwork, + integer *info); + +/* Subroutine */ int dtgsja_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, integer *k, integer *l, doublereal *a, + integer *lda, doublereal *b, integer *ldb, doublereal *tola, + doublereal *tolb, doublereal *alpha, doublereal *beta, doublereal *u, + integer *ldu, doublereal *v, integer *ldv, doublereal *q, integer * + ldq, doublereal *work, integer *ncycle, integer *info); + +/* Subroutine */ int dtgsna_(char *job, char *howmny, logical *select, + integer *n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *vl, integer *ldvl, doublereal *vr, integer *ldvr, + doublereal *s, doublereal *dif, integer *mm, integer *m, doublereal * + work, integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int dtgsy2_(char *trans, integer *ijob, integer *m, integer * + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, + doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * + scale, doublereal *rdsum, doublereal *rdscal, integer *iwork, integer + *pq, integer *info); + +/* Subroutine */ int dtgsyl_(char *trans, integer *ijob, integer *m, integer * + n, doublereal *a, integer *lda, doublereal *b, integer *ldb, + doublereal *c__, integer *ldc, doublereal *d__, integer *ldd, + doublereal *e, integer *lde, doublereal *f, integer *ldf, doublereal * + scale, doublereal *dif, doublereal *work, integer *lwork, integer * + iwork, integer *info); + +/* Subroutine */ int dtpcon_(char *norm, char *uplo, char *diag, integer *n, + doublereal *ap, doublereal *rcond, doublereal *work, integer *iwork, + integer *info); + +/* Subroutine */ int dtprfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, + doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dtptri_(char *uplo, char *diag, integer *n, doublereal * + ap, integer *info); + +/* Subroutine */ int dtptrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublereal *ap, doublereal *b, integer *ldb, integer * + info); + +/* Subroutine */ int dtrcon_(char *norm, char *uplo, char *diag, integer *n, + doublereal *a, integer *lda, doublereal *rcond, doublereal *work, + integer *iwork, integer *info); + +/* Subroutine */ int dtrevc_(char *side, char *howmny, logical *select, + integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * + ldvl, doublereal *vr, integer *ldvr, integer *mm, integer *m, + doublereal *work, integer *info); + +/* Subroutine */ int dtrexc_(char *compq, integer *n, doublereal *t, integer * + ldt, doublereal *q, integer *ldq, integer *ifst, integer *ilst, + doublereal *work, integer *info); + +/* Subroutine */ int dtrrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * + ldb, doublereal *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublereal *work, integer *iwork, integer *info); + +/* Subroutine */ int dtrsen_(char *job, char *compq, logical *select, integer + *n, doublereal *t, integer *ldt, doublereal *q, integer *ldq, + doublereal *wr, doublereal *wi, integer *m, doublereal *s, doublereal + *sep, doublereal *work, integer *lwork, integer *iwork, integer * + liwork, integer *info); + +/* Subroutine */ int dtrsna_(char *job, char *howmny, logical *select, + integer *n, doublereal *t, integer *ldt, doublereal *vl, integer * + ldvl, doublereal *vr, integer *ldvr, doublereal *s, doublereal *sep, + integer *mm, integer *m, doublereal *work, integer *ldwork, integer * + iwork, integer *info); + +/* Subroutine */ int dtrsyl_(char *trana, char *tranb, integer *isgn, integer + *m, integer *n, doublereal *a, integer *lda, doublereal *b, integer * + ldb, doublereal *c__, integer *ldc, doublereal *scale, integer *info); + +/* Subroutine */ int dtrti2_(char *uplo, char *diag, integer *n, doublereal * + a, integer *lda, integer *info); + +/* Subroutine */ int dtrtri_(char *uplo, char *diag, integer *n, doublereal * + a, integer *lda, integer *info); + +/* Subroutine */ int dtrtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublereal *a, integer *lda, doublereal *b, integer * + ldb, integer *info); + +/* Subroutine */ int dtzrqf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, integer *info); + +/* Subroutine */ int dtzrzf_(integer *m, integer *n, doublereal *a, integer * + lda, doublereal *tau, doublereal *work, integer *lwork, integer *info); + +/* Subroutine */ int ilaver_(integer *vers_major__, integer *vers_minor__, + integer *vers_patch__); + +/* Subroutine */ int dgesv_(integer *n, integer *nrhs, doublereal *a, integer + *lda, integer *ipiv, doublereal *b, integer *ldb, integer *info); + +/* Subroutine */ int sbdsdc_(char *uplo, char *compq, integer *n, real *d__, + real *e, real *u, integer *ldu, real *vt, integer *ldvt, real *q, + integer *iq, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sbdsqr_(char *uplo, integer *n, integer *ncvt, integer * + nru, integer *ncc, real *d__, real *e, real *vt, integer *ldvt, real * + u, integer *ldu, real *c__, integer *ldc, real *work, integer *info); + +/* Subroutine */ int sdisna_(char *job, integer *m, integer *n, real *d__, + real *sep, integer *info); + +/* Subroutine */ int sgbbrd_(char *vect, integer *m, integer *n, integer *ncc, + integer *kl, integer *ku, real *ab, integer *ldab, real *d__, real * + e, real *q, integer *ldq, real *pt, integer *ldpt, real *c__, integer + *ldc, real *work, integer *info); + +/* Subroutine */ int sgbcon_(char *norm, integer *n, integer *kl, integer *ku, + real *ab, integer *ldab, integer *ipiv, real *anorm, real *rcond, + real *work, integer *iwork, integer *info); + +/* Subroutine */ int sgbequ_(integer *m, integer *n, integer *kl, integer *ku, + real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real * + colcnd, real *amax, integer *info); + +/* Subroutine */ int sgbrfs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, + integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real * + ferr, real *berr, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sgbsv_(integer *n, integer *kl, integer *ku, integer * + nrhs, real *ab, integer *ldab, integer *ipiv, real *b, integer *ldb, + integer *info); + +/* Subroutine */ int sgbsvx_(char *fact, char *trans, integer *n, integer *kl, + integer *ku, integer *nrhs, real *ab, integer *ldab, real *afb, + integer *ldafb, integer *ipiv, char *equed, real *r__, real *c__, + real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, + real *berr, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sgbtf2_(integer *m, integer *n, integer *kl, integer *ku, + real *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int sgbtrf_(integer *m, integer *n, integer *kl, integer *ku, + real *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int sgbtrs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, real *ab, integer *ldab, integer *ipiv, real *b, + integer *ldb, integer *info); + +/* Subroutine */ int sgebak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, real *scale, integer *m, real *v, integer *ldv, integer + *info); + +/* Subroutine */ int sgebal_(char *job, integer *n, real *a, integer *lda, + integer *ilo, integer *ihi, real *scale, integer *info); + +/* Subroutine */ int sgebd2_(integer *m, integer *n, real *a, integer *lda, + real *d__, real *e, real *tauq, real *taup, real *work, integer *info); + +/* Subroutine */ int sgebrd_(integer *m, integer *n, real *a, integer *lda, + real *d__, real *e, real *tauq, real *taup, real *work, integer * + lwork, integer *info); + +/* Subroutine */ int sgecon_(char *norm, integer *n, real *a, integer *lda, + real *anorm, real *rcond, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sgeequ_(integer *m, integer *n, real *a, integer *lda, + real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, integer + *info); + +/* Subroutine */ int sgees_(char *jobvs, char *sort, L_fp select, integer *n, + real *a, integer *lda, integer *sdim, real *wr, real *wi, real *vs, + integer *ldvs, real *work, integer *lwork, logical *bwork, integer * + info); + +/* Subroutine */ int sgeesx_(char *jobvs, char *sort, L_fp select, char * + sense, integer *n, real *a, integer *lda, integer *sdim, real *wr, + real *wi, real *vs, integer *ldvs, real *rconde, real *rcondv, real * + work, integer *lwork, integer *iwork, integer *liwork, logical *bwork, + integer *info); + +/* Subroutine */ int sgeev_(char *jobvl, char *jobvr, integer *n, real *a, + integer *lda, real *wr, real *wi, real *vl, integer *ldvl, real *vr, + integer *ldvr, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgeevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, real *a, integer *lda, real *wr, real *wi, real * + vl, integer *ldvl, real *vr, integer *ldvr, integer *ilo, integer * + ihi, real *scale, real *abnrm, real *rconde, real *rcondv, real *work, + integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int sgegs_(char *jobvsl, char *jobvsr, integer *n, real *a, + integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real + *beta, real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real * + work, integer *lwork, integer *info); + +/* Subroutine */ int sgegv_(char *jobvl, char *jobvr, integer *n, real *a, + integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real + *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int sgehd2_(integer *n, integer *ilo, integer *ihi, real *a, + integer *lda, real *tau, real *work, integer *info); + +/* Subroutine */ int sgehrd_(integer *n, integer *ilo, integer *ihi, real *a, + integer *lda, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgelq2_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *info); + +/* Subroutine */ int sgelqf_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgels_(char *trans, integer *m, integer *n, integer * + nrhs, real *a, integer *lda, real *b, integer *ldb, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int sgelsd_(integer *m, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, real *s, real *rcond, integer * + rank, real *work, integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int sgelss_(integer *m, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, real *s, real *rcond, integer * + rank, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgelsx_(integer *m, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *jpvt, real *rcond, + integer *rank, real *work, integer *info); + +/* Subroutine */ int sgelsy_(integer *m, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *jpvt, real *rcond, + integer *rank, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgeql2_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *info); + +/* Subroutine */ int sgeqlf_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgeqp3_(integer *m, integer *n, real *a, integer *lda, + integer *jpvt, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgeqpf_(integer *m, integer *n, real *a, integer *lda, + integer *jpvt, real *tau, real *work, integer *info); + +/* Subroutine */ int sgeqr2_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *info); + +/* Subroutine */ int sgeqrf_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgerfs_(char *trans, integer *n, integer *nrhs, real *a, + integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, + integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * + work, integer *iwork, integer *info); + +/* Subroutine */ int sgerq2_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *info); + +/* Subroutine */ int sgerqf_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgesc2_(integer *n, real *a, integer *lda, real *rhs, + integer *ipiv, integer *jpiv, real *scale); + +/* Subroutine */ int sgesdd_(char *jobz, integer *m, integer *n, real *a, + integer *lda, real *s, real *u, integer *ldu, real *vt, integer *ldvt, + real *work, integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int sgesv_(integer *n, integer *nrhs, real *a, integer *lda, + integer *ipiv, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sgesvd_(char *jobu, char *jobvt, integer *m, integer *n, + real *a, integer *lda, real *s, real *u, integer *ldu, real *vt, + integer *ldvt, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgesvx_(char *fact, char *trans, integer *n, integer * + nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, + char *equed, real *r__, real *c__, real *b, integer *ldb, real *x, + integer *ldx, real *rcond, real *ferr, real *berr, real *work, + integer *iwork, integer *info); + +/* Subroutine */ int sgetc2_(integer *n, real *a, integer *lda, integer *ipiv, + integer *jpiv, integer *info); + +/* Subroutine */ int sgetf2_(integer *m, integer *n, real *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int sgetrf_(integer *m, integer *n, real *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int sgetri_(integer *n, real *a, integer *lda, integer *ipiv, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgetrs_(char *trans, integer *n, integer *nrhs, real *a, + integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sggbak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, real *lscale, real *rscale, integer *m, real *v, + integer *ldv, integer *info); + +/* Subroutine */ int sggbal_(char *job, integer *n, real *a, integer *lda, + real *b, integer *ldb, integer *ilo, integer *ihi, real *lscale, real + *rscale, real *work, integer *info); + +/* Subroutine */ int sgges_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, integer *n, real *a, integer *lda, real *b, integer *ldb, + integer *sdim, real *alphar, real *alphai, real *beta, real *vsl, + integer *ldvsl, real *vsr, integer *ldvsr, real *work, integer *lwork, + logical *bwork, integer *info); + +/* Subroutine */ int sggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, char *sense, integer *n, real *a, integer *lda, real *b, + integer *ldb, integer *sdim, real *alphar, real *alphai, real *beta, + real *vsl, integer *ldvsl, real *vsr, integer *ldvsr, real *rconde, + real *rcondv, real *work, integer *lwork, integer *iwork, integer * + liwork, logical *bwork, integer *info); + +/* Subroutine */ int sggev_(char *jobvl, char *jobvr, integer *n, real *a, + integer *lda, real *b, integer *ldb, real *alphar, real *alphai, real + *beta, real *vl, integer *ldvl, real *vr, integer *ldvr, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int sggevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, real *a, integer *lda, real *b, integer *ldb, real + *alphar, real *alphai, real *beta, real *vl, integer *ldvl, real *vr, + integer *ldvr, integer *ilo, integer *ihi, real *lscale, real *rscale, + real *abnrm, real *bbnrm, real *rconde, real *rcondv, real *work, + integer *lwork, integer *iwork, logical *bwork, integer *info); + +/* Subroutine */ int sggglm_(integer *n, integer *m, integer *p, real *a, + integer *lda, real *b, integer *ldb, real *d__, real *x, real *y, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sgghrd_(char *compq, char *compz, integer *n, integer * + ilo, integer *ihi, real *a, integer *lda, real *b, integer *ldb, real + *q, integer *ldq, real *z__, integer *ldz, integer *info); + +/* Subroutine */ int sgglse_(integer *m, integer *n, integer *p, real *a, + integer *lda, real *b, integer *ldb, real *c__, real *d__, real *x, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sggqrf_(integer *n, integer *m, integer *p, real *a, + integer *lda, real *taua, real *b, integer *ldb, real *taub, real * + work, integer *lwork, integer *info); + +/* Subroutine */ int sggrqf_(integer *m, integer *p, integer *n, real *a, + integer *lda, real *taua, real *b, integer *ldb, real *taub, real * + work, integer *lwork, integer *info); + +/* Subroutine */ int sggsvd_(char *jobu, char *jobv, char *jobq, integer *m, + integer *n, integer *p, integer *k, integer *l, real *a, integer *lda, + real *b, integer *ldb, real *alpha, real *beta, real *u, integer * + ldu, real *v, integer *ldv, real *q, integer *ldq, real *work, + integer *iwork, integer *info); + +/* Subroutine */ int sggsvp_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, real *a, integer *lda, real *b, integer *ldb, + real *tola, real *tolb, integer *k, integer *l, real *u, integer *ldu, + real *v, integer *ldv, real *q, integer *ldq, integer *iwork, real * + tau, real *work, integer *info); + +/* Subroutine */ int sgtcon_(char *norm, integer *n, real *dl, real *d__, + real *du, real *du2, integer *ipiv, real *anorm, real *rcond, real * + work, integer *iwork, integer *info); + +/* Subroutine */ int sgtrfs_(char *trans, integer *n, integer *nrhs, real *dl, + real *d__, real *du, real *dlf, real *df, real *duf, real *du2, + integer *ipiv, real *b, integer *ldb, real *x, integer *ldx, real * + ferr, real *berr, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sgtsv_(integer *n, integer *nrhs, real *dl, real *d__, + real *du, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sgtsvx_(char *fact, char *trans, integer *n, integer * + nrhs, real *dl, real *d__, real *du, real *dlf, real *df, real *duf, + real *du2, integer *ipiv, real *b, integer *ldb, real *x, integer * + ldx, real *rcond, real *ferr, real *berr, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int sgttrf_(integer *n, real *dl, real *d__, real *du, real * + du2, integer *ipiv, integer *info); + +/* Subroutine */ int sgttrs_(char *trans, integer *n, integer *nrhs, real *dl, + real *d__, real *du, real *du2, integer *ipiv, real *b, integer *ldb, + integer *info); + +/* Subroutine */ int sgtts2_(integer *itrans, integer *n, integer *nrhs, real + *dl, real *d__, real *du, real *du2, integer *ipiv, real *b, integer * + ldb); + +/* Subroutine */ int shgeqz_(char *job, char *compq, char *compz, integer *n, + integer *ilo, integer *ihi, real *h__, integer *ldh, real *t, integer + *ldt, real *alphar, real *alphai, real *beta, real *q, integer *ldq, + real *z__, integer *ldz, real *work, integer *lwork, integer *info); + +/* Subroutine */ int shsein_(char *side, char *eigsrc, char *initv, logical * + select, integer *n, real *h__, integer *ldh, real *wr, real *wi, real + *vl, integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, + real *work, integer *ifaill, integer *ifailr, integer *info); + +/* Subroutine */ int shseqr_(char *job, char *compz, integer *n, integer *ilo, + integer *ihi, real *h__, integer *ldh, real *wr, real *wi, real *z__, + integer *ldz, real *work, integer *lwork, integer *info); + +/* Subroutine */ int slabad_(real *small, real *large); + +/* Subroutine */ int slabrd_(integer *m, integer *n, integer *nb, real *a, + integer *lda, real *d__, real *e, real *tauq, real *taup, real *x, + integer *ldx, real *y, integer *ldy); + +/* Subroutine */ int slacn2_(integer *n, real *v, real *x, integer *isgn, + real *est, integer *kase, integer *isave); + +/* Subroutine */ int slacon_(integer *n, real *v, real *x, integer *isgn, + real *est, integer *kase); + +/* Subroutine */ int slacpy_(char *uplo, integer *m, integer *n, real *a, + integer *lda, real *b, integer *ldb); + +/* Subroutine */ int sladiv_(real *a, real *b, real *c__, real *d__, real *p, + real *q); + +/* Subroutine */ int slae2_(real *a, real *b, real *c__, real *rt1, real *rt2); + +/* Subroutine */ int slaebz_(integer *ijob, integer *nitmax, integer *n, + integer *mmax, integer *minp, integer *nbmin, real *abstol, real * + reltol, real *pivmin, real *d__, real *e, real *e2, integer *nval, + real *ab, real *c__, integer *mout, integer *nab, real *work, integer + *iwork, integer *info); + +/* Subroutine */ int slaed0_(integer *icompq, integer *qsiz, integer *n, real + *d__, real *e, real *q, integer *ldq, real *qstore, integer *ldqs, + real *work, integer *iwork, integer *info); + +/* Subroutine */ int slaed1_(integer *n, real *d__, real *q, integer *ldq, + integer *indxq, real *rho, integer *cutpnt, real *work, integer * + iwork, integer *info); + +/* Subroutine */ int slaed2_(integer *k, integer *n, integer *n1, real *d__, + real *q, integer *ldq, integer *indxq, real *rho, real *z__, real * + dlamda, real *w, real *q2, integer *indx, integer *indxc, integer * + indxp, integer *coltyp, integer *info); + +/* Subroutine */ int slaed3_(integer *k, integer *n, integer *n1, real *d__, + real *q, integer *ldq, real *rho, real *dlamda, real *q2, integer * + indx, integer *ctot, real *w, real *s, integer *info); + +/* Subroutine */ int slaed4_(integer *n, integer *i__, real *d__, real *z__, + real *delta, real *rho, real *dlam, integer *info); + +/* Subroutine */ int slaed5_(integer *i__, real *d__, real *z__, real *delta, + real *rho, real *dlam); + +/* Subroutine */ int slaed6_(integer *kniter, logical *orgati, real *rho, + real *d__, real *z__, real *finit, real *tau, integer *info); + +/* Subroutine */ int slaed7_(integer *icompq, integer *n, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, real *d__, real *q, + integer *ldq, integer *indxq, real *rho, integer *cutpnt, real * + qstore, integer *qptr, integer *prmptr, integer *perm, integer * + givptr, integer *givcol, real *givnum, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int slaed8_(integer *icompq, integer *k, integer *n, integer + *qsiz, real *d__, real *q, integer *ldq, integer *indxq, real *rho, + integer *cutpnt, real *z__, real *dlamda, real *q2, integer *ldq2, + real *w, integer *perm, integer *givptr, integer *givcol, real * + givnum, integer *indxp, integer *indx, integer *info); + +/* Subroutine */ int slaed9_(integer *k, integer *kstart, integer *kstop, + integer *n, real *d__, real *q, integer *ldq, real *rho, real *dlamda, + real *w, real *s, integer *lds, integer *info); + +/* Subroutine */ int slaeda_(integer *n, integer *tlvls, integer *curlvl, + integer *curpbm, integer *prmptr, integer *perm, integer *givptr, + integer *givcol, real *givnum, real *q, integer *qptr, real *z__, + real *ztemp, integer *info); + +/* Subroutine */ int slaein_(logical *rightv, logical *noinit, integer *n, + real *h__, integer *ldh, real *wr, real *wi, real *vr, real *vi, real + *b, integer *ldb, real *work, real *eps3, real *smlnum, real *bignum, + integer *info); + +/* Subroutine */ int slaev2_(real *a, real *b, real *c__, real *rt1, real * + rt2, real *cs1, real *sn1); + +/* Subroutine */ int slaexc_(logical *wantq, integer *n, real *t, integer * + ldt, real *q, integer *ldq, integer *j1, integer *n1, integer *n2, + real *work, integer *info); + +/* Subroutine */ int slag2_(real *a, integer *lda, real *b, integer *ldb, + real *safmin, real *scale1, real *scale2, real *wr1, real *wr2, real * + wi); + +/* Subroutine */ int slag2d_(integer *m, integer *n, real *sa, integer *ldsa, + doublereal *a, integer *lda, integer *info); + +/* Subroutine */ int slags2_(logical *upper, real *a1, real *a2, real *a3, + real *b1, real *b2, real *b3, real *csu, real *snu, real *csv, real * + snv, real *csq, real *snq); + +/* Subroutine */ int slagtf_(integer *n, real *a, real *lambda, real *b, real + *c__, real *tol, real *d__, integer *in, integer *info); + +/* Subroutine */ int slagtm_(char *trans, integer *n, integer *nrhs, real * + alpha, real *dl, real *d__, real *du, real *x, integer *ldx, real * + beta, real *b, integer *ldb); + +/* Subroutine */ int slagts_(integer *job, integer *n, real *a, real *b, real + *c__, real *d__, integer *in, real *y, real *tol, integer *info); + +/* Subroutine */ int slagv2_(real *a, integer *lda, real *b, integer *ldb, + real *alphar, real *alphai, real *beta, real *csl, real *snl, real * + csr, real *snr); + +/* Subroutine */ int slahqr_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * + wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, integer * + info); + +/* Subroutine */ int slahr2_(integer *n, integer *k, integer *nb, real *a, + integer *lda, real *tau, real *t, integer *ldt, real *y, integer *ldy); + +/* Subroutine */ int slahrd_(integer *n, integer *k, integer *nb, real *a, + integer *lda, real *tau, real *t, integer *ldt, real *y, integer *ldy); + +/* Subroutine */ int slaic1_(integer *job, integer *j, real *x, real *sest, + real *w, real *gamma, real *sestpr, real *s, real *c__); + +/* Subroutine */ int slaln2_(logical *ltrans, integer *na, integer *nw, real * + smin, real *ca, real *a, integer *lda, real *d1, real *d2, real *b, + integer *ldb, real *wr, real *wi, real *x, integer *ldx, real *scale, + real *xnorm, integer *info); + +/* Subroutine */ int slals0_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *nrhs, real *b, integer *ldb, real *bx, + integer *ldbx, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * + difl, real *difr, real *z__, integer *k, real *c__, real *s, real * + work, integer *info); + +/* Subroutine */ int slalsa_(integer *icompq, integer *smlsiz, integer *n, + integer *nrhs, real *b, integer *ldb, real *bx, integer *ldbx, real * + u, integer *ldu, real *vt, integer *k, real *difl, real *difr, real * + z__, real *poles, integer *givptr, integer *givcol, integer *ldgcol, + integer *perm, real *givnum, real *c__, real *s, real *work, integer * + iwork, integer *info); + +/* Subroutine */ int slalsd_(char *uplo, integer *smlsiz, integer *n, integer + *nrhs, real *d__, real *e, real *b, integer *ldb, real *rcond, + integer *rank, real *work, integer *iwork, integer *info); + +/* Subroutine */ int slamrg_(integer *n1, integer *n2, real *a, integer * + strd1, integer *strd2, integer *index); + +/* Subroutine */ int slanv2_(real *a, real *b, real *c__, real *d__, real * + rt1r, real *rt1i, real *rt2r, real *rt2i, real *cs, real *sn); + +/* Subroutine */ int slapll_(integer *n, real *x, integer *incx, real *y, + integer *incy, real *ssmin); + +/* Subroutine */ int slapmt_(logical *forwrd, integer *m, integer *n, real *x, + integer *ldx, integer *k); + +/* Subroutine */ int slaqgb_(integer *m, integer *n, integer *kl, integer *ku, + real *ab, integer *ldab, real *r__, real *c__, real *rowcnd, real * + colcnd, real *amax, char *equed); + +/* Subroutine */ int slaqge_(integer *m, integer *n, real *a, integer *lda, + real *r__, real *c__, real *rowcnd, real *colcnd, real *amax, char * + equed); + +/* Subroutine */ int slaqp2_(integer *m, integer *n, integer *offset, real *a, + integer *lda, integer *jpvt, real *tau, real *vn1, real *vn2, real * + work); + +/* Subroutine */ int slaqps_(integer *m, integer *n, integer *offset, integer + *nb, integer *kb, real *a, integer *lda, integer *jpvt, real *tau, + real *vn1, real *vn2, real *auxv, real *f, integer *ldf); + +/* Subroutine */ int slaqr0_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * + wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int slaqr1_(integer *n, real *h__, integer *ldh, real *sr1, + real *si1, real *sr2, real *si2, real *v); + +/* Subroutine */ int slaqr2_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, real *h__, integer *ldh, + integer *iloz, integer *ihiz, real *z__, integer *ldz, integer *ns, + integer *nd, real *sr, real *si, real *v, integer *ldv, integer *nh, + real *t, integer *ldt, integer *nv, real *wv, integer *ldwv, real * + work, integer *lwork); + +/* Subroutine */ int slaqr3_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, real *h__, integer *ldh, + integer *iloz, integer *ihiz, real *z__, integer *ldz, integer *ns, + integer *nd, real *sr, real *si, real *v, integer *ldv, integer *nh, + real *t, integer *ldt, integer *nv, real *wv, integer *ldwv, real * + work, integer *lwork); + +/* Subroutine */ int slaqr4_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, real *h__, integer *ldh, real *wr, real * + wi, integer *iloz, integer *ihiz, real *z__, integer *ldz, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int slaqr5_(logical *wantt, logical *wantz, integer *kacc22, + integer *n, integer *ktop, integer *kbot, integer *nshfts, real *sr, + real *si, real *h__, integer *ldh, integer *iloz, integer *ihiz, real + *z__, integer *ldz, real *v, integer *ldv, real *u, integer *ldu, + integer *nv, real *wv, integer *ldwv, integer *nh, real *wh, integer * + ldwh); + +/* Subroutine */ int slaqsb_(char *uplo, integer *n, integer *kd, real *ab, + integer *ldab, real *s, real *scond, real *amax, char *equed ); + +/* Subroutine */ int slaqsp_(char *uplo, integer *n, real *ap, real *s, real * + scond, real *amax, char *equed); + +/* Subroutine */ int slaqsy_(char *uplo, integer *n, real *a, integer *lda, + real *s, real *scond, real *amax, char *equed); + +/* Subroutine */ int slaqtr_(logical *ltran, logical *lreal, integer *n, real + *t, integer *ldt, real *b, real *w, real *scale, real *x, real *work, + integer *info); + +/* Subroutine */ int slar1v_(integer *n, integer *b1, integer *bn, real * + lambda, real *d__, real *l, real *ld, real *lld, real *pivmin, real * + gaptol, real *z__, logical *wantnc, integer *negcnt, real *ztz, real * + mingma, integer *r__, integer *isuppz, real *nrminv, real *resid, + real *rqcorr, real *work); + +/* Subroutine */ int slar2v_(integer *n, real *x, real *y, real *z__, integer + *incx, real *c__, real *s, integer *incc); + +/* Subroutine */ int slarf_(char *side, integer *m, integer *n, real *v, + integer *incv, real *tau, real *c__, integer *ldc, real *work ); + +/* Subroutine */ int slarfb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, real *v, integer *ldv, + real *t, integer *ldt, real *c__, integer *ldc, real *work, integer * + ldwork ); + +/* Subroutine */ int slarfg_(integer *n, real *alpha, real *x, integer *incx, + real *tau); + +/* Subroutine */ int slarft_(char *direct, char *storev, integer *n, integer * + k, real *v, integer *ldv, real *tau, real *t, integer *ldt ); + +/* Subroutine */ int slarfx_(char *side, integer *m, integer *n, real *v, + real *tau, real *c__, integer *ldc, real *work); + +/* Subroutine */ int slargv_(integer *n, real *x, integer *incx, real *y, + integer *incy, real *c__, integer *incc); + +/* Subroutine */ int slarnv_(integer *idist, integer *iseed, integer *n, real + *x); + +/* Subroutine */ int slarra_(integer *n, real *d__, real *e, real *e2, real * + spltol, real *tnrm, integer *nsplit, integer *isplit, integer *info); + +/* Subroutine */ int slarrb_(integer *n, real *d__, real *lld, integer * + ifirst, integer *ilast, real *rtol1, real *rtol2, integer *offset, + real *w, real *wgap, real *werr, real *work, integer *iwork, real * + pivmin, real *spdiam, integer *twist, integer *info); + +/* Subroutine */ int slarrc_(char *jobt, integer *n, real *vl, real *vu, real + *d__, real *e, real *pivmin, integer *eigcnt, integer *lcnt, integer * + rcnt, integer *info); + +/* Subroutine */ int slarrd_(char *range, char *order, integer *n, real *vl, + real *vu, integer *il, integer *iu, real *gers, real *reltol, real * + d__, real *e, real *e2, real *pivmin, integer *nsplit, integer * + isplit, integer *m, real *w, real *werr, real *wl, real *wu, integer * + iblock, integer *indexw, real *work, integer *iwork, integer *info); + +/* Subroutine */ int slarre_(char *range, integer *n, real *vl, real *vu, + integer *il, integer *iu, real *d__, real *e, real *e2, real *rtol1, + real *rtol2, real *spltol, integer *nsplit, integer *isplit, integer * + m, real *w, real *werr, real *wgap, integer *iblock, integer *indexw, + real *gers, real *pivmin, real *work, integer *iwork, integer *info); + +/* Subroutine */ int slarrf_(integer *n, real *d__, real *l, real *ld, + integer *clstrt, integer *clend, real *w, real *wgap, real *werr, + real *spdiam, real *clgapl, real *clgapr, real *pivmin, real *sigma, + real *dplus, real *lplus, real *work, integer *info); + +/* Subroutine */ int slarrj_(integer *n, real *d__, real *e2, integer *ifirst, + integer *ilast, real *rtol, integer *offset, real *w, real *werr, + real *work, integer *iwork, real *pivmin, real *spdiam, integer *info); + +/* Subroutine */ int slarrk_(integer *n, integer *iw, real *gl, real *gu, + real *d__, real *e2, real *pivmin, real *reltol, real *w, real *werr, + integer *info); + +/* Subroutine */ int slarrr_(integer *n, real *d__, real *e, integer *info); + +/* Subroutine */ int slarrv_(integer *n, real *vl, real *vu, real *d__, real * + l, real *pivmin, integer *isplit, integer *m, integer *dol, integer * + dou, real *minrgp, real *rtol1, real *rtol2, real *w, real *werr, + real *wgap, integer *iblock, integer *indexw, real *gers, real *z__, + integer *ldz, integer *isuppz, real *work, integer *iwork, integer * + info); + +/* Subroutine */ int slartg_(real *f, real *g, real *cs, real *sn, real *r__); + +/* Subroutine */ int slartv_(integer *n, real *x, integer *incx, real *y, + integer *incy, real *c__, real *s, integer *incc); + +/* Subroutine */ int slaruv_(integer *iseed, integer *n, real *x); + +/* Subroutine */ int slarz_(char *side, integer *m, integer *n, integer *l, + real *v, integer *incv, real *tau, real *c__, integer *ldc, real * + work); + +/* Subroutine */ int slarzb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, integer *l, real *v, + integer *ldv, real *t, integer *ldt, real *c__, integer *ldc, real * + work, integer *ldwork ); + +/* Subroutine */ int slarzt_(char *direct, char *storev, integer *n, integer * + k, real *v, integer *ldv, real *tau, real *t, integer *ldt ); + +/* Subroutine */ int slas2_(real *f, real *g, real *h__, real *ssmin, real * + ssmax); + +/* Subroutine */ int slascl_(char *type__, integer *kl, integer *ku, real * + cfrom, real *cto, integer *m, integer *n, real *a, integer *lda, + integer *info); + +/* Subroutine */ int slasd0_(integer *n, integer *sqre, real *d__, real *e, + real *u, integer *ldu, real *vt, integer *ldvt, integer *smlsiz, + integer *iwork, real *work, integer *info); + +/* Subroutine */ int slasd1_(integer *nl, integer *nr, integer *sqre, real * + d__, real *alpha, real *beta, real *u, integer *ldu, real *vt, + integer *ldvt, integer *idxq, integer *iwork, real *work, integer * + info); + +/* Subroutine */ int slasd2_(integer *nl, integer *nr, integer *sqre, integer + *k, real *d__, real *z__, real *alpha, real *beta, real *u, integer * + ldu, real *vt, integer *ldvt, real *dsigma, real *u2, integer *ldu2, + real *vt2, integer *ldvt2, integer *idxp, integer *idx, integer *idxc, + integer *idxq, integer *coltyp, integer *info); + +/* Subroutine */ int slasd3_(integer *nl, integer *nr, integer *sqre, integer + *k, real *d__, real *q, integer *ldq, real *dsigma, real *u, integer * + ldu, real *u2, integer *ldu2, real *vt, integer *ldvt, real *vt2, + integer *ldvt2, integer *idxc, integer *ctot, real *z__, integer * + info); + +/* Subroutine */ int slasd4_(integer *n, integer *i__, real *d__, real *z__, + real *delta, real *rho, real *sigma, real *work, integer *info); + +/* Subroutine */ int slasd5_(integer *i__, real *d__, real *z__, real *delta, + real *rho, real *dsigma, real *work); + +/* Subroutine */ int slasd6_(integer *icompq, integer *nl, integer *nr, + integer *sqre, real *d__, real *vf, real *vl, real *alpha, real *beta, + integer *idxq, integer *perm, integer *givptr, integer *givcol, + integer *ldgcol, real *givnum, integer *ldgnum, real *poles, real * + difl, real *difr, real *z__, integer *k, real *c__, real *s, real * + work, integer *iwork, integer *info); + +/* Subroutine */ int slasd7_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *k, real *d__, real *z__, real *zw, real *vf, + real *vfw, real *vl, real *vlw, real *alpha, real *beta, real *dsigma, + integer *idx, integer *idxp, integer *idxq, integer *perm, integer * + givptr, integer *givcol, integer *ldgcol, real *givnum, integer * + ldgnum, real *c__, real *s, integer *info); + +/* Subroutine */ int slasd8_(integer *icompq, integer *k, real *d__, real * + z__, real *vf, real *vl, real *difl, real *difr, integer *lddifr, + real *dsigma, real *work, integer *info); + +/* Subroutine */ int slasd9_(integer *icompq, integer *ldu, integer *k, real * + d__, real *z__, real *vf, real *vl, real *difl, real *difr, real * + dsigma, real *work, integer *info); + +/* Subroutine */ int slasda_(integer *icompq, integer *smlsiz, integer *n, + integer *sqre, real *d__, real *e, real *u, integer *ldu, real *vt, + integer *k, real *difl, real *difr, real *z__, real *poles, integer * + givptr, integer *givcol, integer *ldgcol, integer *perm, real *givnum, + real *c__, real *s, real *work, integer *iwork, integer *info); + +/* Subroutine */ int slasdq_(char *uplo, integer *sqre, integer *n, integer * + ncvt, integer *nru, integer *ncc, real *d__, real *e, real *vt, + integer *ldvt, real *u, integer *ldu, real *c__, integer *ldc, real * + work, integer *info); + +/* Subroutine */ int slasdt_(integer *n, integer *lvl, integer *nd, integer * + inode, integer *ndiml, integer *ndimr, integer *msub); + +/* Subroutine */ int slaset_(char *uplo, integer *m, integer *n, real *alpha, + real *beta, real *a, integer *lda); + +/* Subroutine */ int slasq1_(integer *n, real *d__, real *e, real *work, + integer *info); + +/* Subroutine */ int slasq2_(integer *n, real *z__, integer *info); + +/* Subroutine */ int slasq3_(integer *i0, integer *n0, real *z__, integer *pp, + real *dmin__, real *sigma, real *desig, real *qmax, integer *nfail, + integer *iter, integer *ndiv, logical *ieee); + +/* Subroutine */ int slasq4_(integer *i0, integer *n0, real *z__, integer *pp, + integer *n0in, real *dmin__, real *dmin1, real *dmin2, real *dn, + real *dn1, real *dn2, real *tau, integer *ttype); + +/* Subroutine */ int slasq5_(integer *i0, integer *n0, real *z__, integer *pp, + real *tau, real *dmin__, real *dmin1, real *dmin2, real *dn, real * + dnm1, real *dnm2, logical *ieee); + +/* Subroutine */ int slasq6_(integer *i0, integer *n0, real *z__, integer *pp, + real *dmin__, real *dmin1, real *dmin2, real *dn, real *dnm1, real * + dnm2); + +/* Subroutine */ int slasr_(char *side, char *pivot, char *direct, integer *m, + integer *n, real *c__, real *s, real *a, integer *lda ); + +/* Subroutine */ int slasrt_(char *id, integer *n, real *d__, integer *info); + +/* Subroutine */ int slassq_(integer *n, real *x, integer *incx, real *scale, + real *sumsq); + +/* Subroutine */ int slasv2_(real *f, real *g, real *h__, real *ssmin, real * + ssmax, real *snr, real *csr, real *snl, real *csl); + +/* Subroutine */ int slaswp_(integer *n, real *a, integer *lda, integer *k1, + integer *k2, integer *ipiv, integer *incx); + +/* Subroutine */ int slasy2_(logical *ltranl, logical *ltranr, integer *isgn, + integer *n1, integer *n2, real *tl, integer *ldtl, real *tr, integer * + ldtr, real *b, integer *ldb, real *scale, real *x, integer *ldx, real + *xnorm, integer *info); + +/* Subroutine */ int slasyf_(char *uplo, integer *n, integer *nb, integer *kb, + real *a, integer *lda, integer *ipiv, real *w, integer *ldw, integer + *info); + +/* Subroutine */ int slatbs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, integer *kd, real *ab, integer *ldab, real *x, + real *scale, real *cnorm, integer *info); + +/* Subroutine */ int slatdf_(integer *ijob, integer *n, real *z__, integer * + ldz, real *rhs, real *rdsum, real *rdscal, integer *ipiv, integer * + jpiv); + +/* Subroutine */ int slatps_(char *uplo, char *trans, char *diag, char * + normin, integer *n, real *ap, real *x, real *scale, real *cnorm, + integer *info); + +/* Subroutine */ int slatrd_(char *uplo, integer *n, integer *nb, real *a, + integer *lda, real *e, real *tau, real *w, integer *ldw ); + +/* Subroutine */ int slatrs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, real *a, integer *lda, real *x, real *scale, real + *cnorm, integer *info); + +/* Subroutine */ int slatrz_(integer *m, integer *n, integer *l, real *a, + integer *lda, real *tau, real *work); + +/* Subroutine */ int slatzm_(char *side, integer *m, integer *n, real *v, + integer *incv, real *tau, real *c1, real *c2, integer *ldc, real * + work); + +/* Subroutine */ int slauu2_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +/* Subroutine */ int slauum_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +/* Subroutine */ int slazq3_(integer *i0, integer *n0, real *z__, integer *pp, + real *dmin__, real *sigma, real *desig, real *qmax, integer *nfail, + integer *iter, integer *ndiv, logical *ieee, integer *ttype, real * + dmin1, real *dmin2, real *dn, real *dn1, real *dn2, real *tau); + +/* Subroutine */ int slazq4_(integer *i0, integer *n0, real *z__, integer *pp, + integer *n0in, real *dmin__, real *dmin1, real *dmin2, real *dn, + real *dn1, real *dn2, real *tau, integer *ttype, real *g); + +/* Subroutine */ int sopgtr_(char *uplo, integer *n, real *ap, real *tau, + real *q, integer *ldq, real *work, integer *info); + +/* Subroutine */ int sopmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, real *ap, real *tau, real *c__, integer *ldc, real *work, + integer *info); + +/* Subroutine */ int sorg2l_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *info); + +/* Subroutine */ int sorg2r_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *info); + +/* Subroutine */ int sorgbr_(char *vect, integer *m, integer *n, integer *k, + real *a, integer *lda, real *tau, real *work, integer *lwork, integer + *info); + +/* Subroutine */ int sorghr_(integer *n, integer *ilo, integer *ihi, real *a, + integer *lda, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorgl2_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *info); + +/* Subroutine */ int sorglq_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorgql_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorgqr_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorgr2_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *info); + +/* Subroutine */ int sorgrq_(integer *m, integer *n, integer *k, real *a, + integer *lda, real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorgtr_(char *uplo, integer *n, real *a, integer *lda, + real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *info); + +/* Subroutine */ int sorm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *info); + +/* Subroutine */ int sormbr_(char *vect, char *side, char *trans, integer *m, + integer *n, integer *k, real *a, integer *lda, real *tau, real *c__, + integer *ldc, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sormhr_(char *side, char *trans, integer *m, integer *n, + integer *ilo, integer *ihi, real *a, integer *lda, real *tau, real * + c__, integer *ldc, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sorml2_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *info); + +/* Subroutine */ int sormlq_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sormql_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sormqr_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sormr2_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *info); + +/* Subroutine */ int sormr3_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, real *a, integer *lda, real *tau, real *c__, + integer *ldc, real *work, integer *info); + +/* Subroutine */ int sormrq_(char *side, char *trans, integer *m, integer *n, + integer *k, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int sormrz_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, real *a, integer *lda, real *tau, real *c__, + integer *ldc, real *work, integer *lwork, integer *info); + +/* Subroutine */ int sormtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, real *a, integer *lda, real *tau, real *c__, integer *ldc, + real *work, integer *lwork, integer *info); + +/* Subroutine */ int spbcon_(char *uplo, integer *n, integer *kd, real *ab, + integer *ldab, real *anorm, real *rcond, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int spbequ_(char *uplo, integer *n, integer *kd, real *ab, + integer *ldab, real *s, real *scond, real *amax, integer *info); + +/* Subroutine */ int spbrfs_(char *uplo, integer *n, integer *kd, integer * + nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, real *b, + integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * + work, integer *iwork, integer *info); + +/* Subroutine */ int spbstf_(char *uplo, integer *n, integer *kd, real *ab, + integer *ldab, integer *info); + +/* Subroutine */ int spbsv_(char *uplo, integer *n, integer *kd, integer * + nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); + +/* Subroutine */ int spbsvx_(char *fact, char *uplo, integer *n, integer *kd, + integer *nrhs, real *ab, integer *ldab, real *afb, integer *ldafb, + char *equed, real *s, real *b, integer *ldb, real *x, integer *ldx, + real *rcond, real *ferr, real *berr, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int spbtf2_(char *uplo, integer *n, integer *kd, real *ab, + integer *ldab, integer *info); + +/* Subroutine */ int spbtrf_(char *uplo, integer *n, integer *kd, real *ab, + integer *ldab, integer *info); + +/* Subroutine */ int spbtrs_(char *uplo, integer *n, integer *kd, integer * + nrhs, real *ab, integer *ldab, real *b, integer *ldb, integer *info); + +/* Subroutine */ int spocon_(char *uplo, integer *n, real *a, integer *lda, + real *anorm, real *rcond, real *work, integer *iwork, integer *info); + +/* Subroutine */ int spoequ_(integer *n, real *a, integer *lda, real *s, real + *scond, real *amax, integer *info); + +/* Subroutine */ int sporfs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *af, integer *ldaf, real *b, integer *ldb, real *x, + integer *ldx, real *ferr, real *berr, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int sposv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sposvx_(char *fact, char *uplo, integer *n, integer * + nrhs, real *a, integer *lda, real *af, integer *ldaf, char *equed, + real *s, real *b, integer *ldb, real *x, integer *ldx, real *rcond, + real *ferr, real *berr, real *work, integer *iwork, integer *info); + +/* Subroutine */ int spotf2_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +/* Subroutine */ int spotrf_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +/* Subroutine */ int spotri_(char *uplo, integer *n, real *a, integer *lda, + integer *info); + +/* Subroutine */ int spotrs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sppcon_(char *uplo, integer *n, real *ap, real *anorm, + real *rcond, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sppequ_(char *uplo, integer *n, real *ap, real *s, real * + scond, real *amax, integer *info); + +/* Subroutine */ int spprfs_(char *uplo, integer *n, integer *nrhs, real *ap, + real *afp, real *b, integer *ldb, real *x, integer *ldx, real *ferr, + real *berr, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sppsv_(char *uplo, integer *n, integer *nrhs, real *ap, + real *b, integer *ldb, integer *info); + +/* Subroutine */ int sppsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, real *ap, real *afp, char *equed, real *s, real *b, integer * + ldb, real *x, integer *ldx, real *rcond, real *ferr, real *berr, real + *work, integer *iwork, integer *info); + +/* Subroutine */ int spptrf_(char *uplo, integer *n, real *ap, integer *info); + +/* Subroutine */ int spptri_(char *uplo, integer *n, real *ap, integer *info); + +/* Subroutine */ int spptrs_(char *uplo, integer *n, integer *nrhs, real *ap, + real *b, integer *ldb, integer *info); + +/* Subroutine */ int sptcon_(integer *n, real *d__, real *e, real *anorm, + real *rcond, real *work, integer *info); + +/* Subroutine */ int spteqr_(char *compz, integer *n, real *d__, real *e, + real *z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int sptrfs_(integer *n, integer *nrhs, real *d__, real *e, + real *df, real *ef, real *b, integer *ldb, real *x, integer *ldx, + real *ferr, real *berr, real *work, integer *info); + +/* Subroutine */ int sptsv_(integer *n, integer *nrhs, real *d__, real *e, + real *b, integer *ldb, integer *info); + +/* Subroutine */ int sptsvx_(char *fact, integer *n, integer *nrhs, real *d__, + real *e, real *df, real *ef, real *b, integer *ldb, real *x, integer + *ldx, real *rcond, real *ferr, real *berr, real *work, integer *info); + +/* Subroutine */ int spttrf_(integer *n, real *d__, real *e, integer *info); + +/* Subroutine */ int spttrs_(integer *n, integer *nrhs, real *d__, real *e, + real *b, integer *ldb, integer *info); + +/* Subroutine */ int sptts2_(integer *n, integer *nrhs, real *d__, real *e, + real *b, integer *ldb); + +/* Subroutine */ int srscl_(integer *n, real *sa, real *sx, integer *incx); + +/* Subroutine */ int ssbev_(char *jobz, char *uplo, integer *n, integer *kd, + real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, + integer *info); + +/* Subroutine */ int ssbevd_(char *jobz, char *uplo, integer *n, integer *kd, + real *ab, integer *ldab, real *w, real *z__, integer *ldz, real *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int ssbevx_(char *jobz, char *range, char *uplo, integer *n, + integer *kd, real *ab, integer *ldab, real *q, integer *ldq, real *vl, + real *vu, integer *il, integer *iu, real *abstol, integer *m, real * + w, real *z__, integer *ldz, real *work, integer *iwork, integer * + ifail, integer *info); + +/* Subroutine */ int ssbgst_(char *vect, char *uplo, integer *n, integer *ka, + integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * + x, integer *ldx, real *work, integer *info); + +/* Subroutine */ int ssbgv_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * + w, real *z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int ssbgvd_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, real *ab, integer *ldab, real *bb, integer *ldbb, real * + w, real *z__, integer *ldz, real *work, integer *lwork, integer * + iwork, integer *liwork, integer *info); + +/* Subroutine */ int ssbgvx_(char *jobz, char *range, char *uplo, integer *n, + integer *ka, integer *kb, real *ab, integer *ldab, real *bb, integer * + ldbb, real *q, integer *ldq, real *vl, real *vu, integer *il, integer + *iu, real *abstol, integer *m, real *w, real *z__, integer *ldz, real + *work, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int ssbtrd_(char *vect, char *uplo, integer *n, integer *kd, + real *ab, integer *ldab, real *d__, real *e, real *q, integer *ldq, + real *work, integer *info); + +/* Subroutine */ int sspcon_(char *uplo, integer *n, real *ap, integer *ipiv, + real *anorm, real *rcond, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sspev_(char *jobz, char *uplo, integer *n, real *ap, + real *w, real *z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int sspevd_(char *jobz, char *uplo, integer *n, real *ap, + real *w, real *z__, integer *ldz, real *work, integer *lwork, integer + *iwork, integer *liwork, integer *info); + +/* Subroutine */ int sspevx_(char *jobz, char *range, char *uplo, integer *n, + real *ap, real *vl, real *vu, integer *il, integer *iu, real *abstol, + integer *m, real *w, real *z__, integer *ldz, real *work, integer * + iwork, integer *ifail, integer *info); + +/* Subroutine */ int sspgst_(integer *itype, char *uplo, integer *n, real *ap, + real *bp, integer *info); + +/* Subroutine */ int sspgv_(integer *itype, char *jobz, char *uplo, integer * + n, real *ap, real *bp, real *w, real *z__, integer *ldz, real *work, + integer *info); + +/* Subroutine */ int sspgvd_(integer *itype, char *jobz, char *uplo, integer * + n, real *ap, real *bp, real *w, real *z__, integer *ldz, real *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int sspgvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, real *ap, real *bp, real *vl, real *vu, integer *il, + integer *iu, real *abstol, integer *m, real *w, real *z__, integer * + ldz, real *work, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int ssprfs_(char *uplo, integer *n, integer *nrhs, real *ap, + real *afp, integer *ipiv, real *b, integer *ldb, real *x, integer * + ldx, real *ferr, real *berr, real *work, integer *iwork, integer * + info); + +/* Subroutine */ int sspsv_(char *uplo, integer *n, integer *nrhs, real *ap, + integer *ipiv, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sspsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, real *ap, real *afp, integer *ipiv, real *b, integer *ldb, real + *x, integer *ldx, real *rcond, real *ferr, real *berr, real *work, + integer *iwork, integer *info); + +/* Subroutine */ int ssptrd_(char *uplo, integer *n, real *ap, real *d__, + real *e, real *tau, integer *info); + +/* Subroutine */ int ssptrf_(char *uplo, integer *n, real *ap, integer *ipiv, + integer *info); + +/* Subroutine */ int ssptri_(char *uplo, integer *n, real *ap, integer *ipiv, + real *work, integer *info); + +/* Subroutine */ int ssptrs_(char *uplo, integer *n, integer *nrhs, real *ap, + integer *ipiv, real *b, integer *ldb, integer *info); + +/* Subroutine */ int sstebz_(char *range, char *order, integer *n, real *vl, + real *vu, integer *il, integer *iu, real *abstol, real *d__, real *e, + integer *m, integer *nsplit, real *w, integer *iblock, integer * + isplit, real *work, integer *iwork, integer *info); + +/* Subroutine */ int sstedc_(char *compz, integer *n, real *d__, real *e, + real *z__, integer *ldz, real *work, integer *lwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int sstegr_(char *jobz, char *range, integer *n, real *d__, + real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, + integer *m, real *w, real *z__, integer *ldz, integer *isuppz, real * + work, integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int sstein_(integer *n, real *d__, real *e, integer *m, real + *w, integer *iblock, integer *isplit, real *z__, integer *ldz, real * + work, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int sstemr_(char *jobz, char *range, integer *n, real *d__, + real *e, real *vl, real *vu, integer *il, integer *iu, integer *m, + real *w, real *z__, integer *ldz, integer *nzc, integer *isuppz, + logical *tryrac, real *work, integer *lwork, integer *iwork, integer * + liwork, integer *info); + +/* Subroutine */ int ssteqr_(char *compz, integer *n, real *d__, real *e, + real *z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int ssterf_(integer *n, real *d__, real *e, integer *info); + +/* Subroutine */ int sstev_(char *jobz, integer *n, real *d__, real *e, real * + z__, integer *ldz, real *work, integer *info); + +/* Subroutine */ int sstevd_(char *jobz, integer *n, real *d__, real *e, real + *z__, integer *ldz, real *work, integer *lwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int sstevr_(char *jobz, char *range, integer *n, real *d__, + real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, + integer *m, real *w, real *z__, integer *ldz, integer *isuppz, real * + work, integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int sstevx_(char *jobz, char *range, integer *n, real *d__, + real *e, real *vl, real *vu, integer *il, integer *iu, real *abstol, + integer *m, real *w, real *z__, integer *ldz, real *work, integer * + iwork, integer *ifail, integer *info); + +/* Subroutine */ int ssycon_(char *uplo, integer *n, real *a, integer *lda, + integer *ipiv, real *anorm, real *rcond, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int ssyev_(char *jobz, char *uplo, integer *n, real *a, + integer *lda, real *w, real *work, integer *lwork, integer *info); + +/* Subroutine */ int ssyevd_(char *jobz, char *uplo, integer *n, real *a, + integer *lda, real *w, real *work, integer *lwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int ssyevr_(char *jobz, char *range, char *uplo, integer *n, + real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, + real *abstol, integer *m, real *w, real *z__, integer *ldz, integer * + isuppz, real *work, integer *lwork, integer *iwork, integer *liwork, + integer *info); + +/* Subroutine */ int ssyevx_(char *jobz, char *range, char *uplo, integer *n, + real *a, integer *lda, real *vl, real *vu, integer *il, integer *iu, + real *abstol, integer *m, real *w, real *z__, integer *ldz, real * + work, integer *lwork, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int ssygs2_(integer *itype, char *uplo, integer *n, real *a, + integer *lda, real *b, integer *ldb, integer *info); + +/* Subroutine */ int ssygst_(integer *itype, char *uplo, integer *n, real *a, + integer *lda, real *b, integer *ldb, integer *info); + +/* Subroutine */ int ssygv_(integer *itype, char *jobz, char *uplo, integer * + n, real *a, integer *lda, real *b, integer *ldb, real *w, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int ssygvd_(integer *itype, char *jobz, char *uplo, integer * + n, real *a, integer *lda, real *b, integer *ldb, real *w, real *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int ssygvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, real *a, integer *lda, real *b, integer *ldb, real * + vl, real *vu, integer *il, integer *iu, real *abstol, integer *m, + real *w, real *z__, integer *ldz, real *work, integer *lwork, integer + *iwork, integer *ifail, integer *info); + +/* Subroutine */ int ssyrfs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, real *af, integer *ldaf, integer *ipiv, real *b, + integer *ldb, real *x, integer *ldx, real *ferr, real *berr, real * + work, integer *iwork, integer *info); + +/* Subroutine */ int ssysv_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, integer *ipiv, real *b, integer *ldb, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int ssysvx_(char *fact, char *uplo, integer *n, integer * + nrhs, real *a, integer *lda, real *af, integer *ldaf, integer *ipiv, + real *b, integer *ldb, real *x, integer *ldx, real *rcond, real *ferr, + real *berr, real *work, integer *lwork, integer *iwork, integer * + info); + +/* Subroutine */ int ssytd2_(char *uplo, integer *n, real *a, integer *lda, + real *d__, real *e, real *tau, integer *info); + +/* Subroutine */ int ssytf2_(char *uplo, integer *n, real *a, integer *lda, + integer *ipiv, integer *info); + +/* Subroutine */ int ssytrd_(char *uplo, integer *n, real *a, integer *lda, + real *d__, real *e, real *tau, real *work, integer *lwork, integer * + info); + +/* Subroutine */ int ssytrf_(char *uplo, integer *n, real *a, integer *lda, + integer *ipiv, real *work, integer *lwork, integer *info); + +/* Subroutine */ int ssytri_(char *uplo, integer *n, real *a, integer *lda, + integer *ipiv, real *work, integer *info); + +/* Subroutine */ int ssytrs_(char *uplo, integer *n, integer *nrhs, real *a, + integer *lda, integer *ipiv, real *b, integer *ldb, integer *info); + +/* Subroutine */ int stbcon_(char *norm, char *uplo, char *diag, integer *n, + integer *kd, real *ab, integer *ldab, real *rcond, real *work, + integer *iwork, integer *info); + +/* Subroutine */ int stbrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer + *ldb, real *x, integer *ldx, real *ferr, real *berr, real *work, + integer *iwork, integer *info); + +/* Subroutine */ int stbtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, real *ab, integer *ldab, real *b, integer + *ldb, integer *info); + +/* Subroutine */ int stgevc_(char *side, char *howmny, logical *select, + integer *n, real *s, integer *lds, real *p, integer *ldp, real *vl, + integer *ldvl, real *vr, integer *ldvr, integer *mm, integer *m, real + *work, integer *info); + +/* Subroutine */ int stgex2_(logical *wantq, logical *wantz, integer *n, real + *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real * + z__, integer *ldz, integer *j1, integer *n1, integer *n2, real *work, + integer *lwork, integer *info); + +/* Subroutine */ int stgexc_(logical *wantq, logical *wantz, integer *n, real + *a, integer *lda, real *b, integer *ldb, real *q, integer *ldq, real * + z__, integer *ldz, integer *ifst, integer *ilst, real *work, integer * + lwork, integer *info); + +/* Subroutine */ int stgsen_(integer *ijob, logical *wantq, logical *wantz, + logical *select, integer *n, real *a, integer *lda, real *b, integer * + ldb, real *alphar, real *alphai, real *beta, real *q, integer *ldq, + real *z__, integer *ldz, integer *m, real *pl, real *pr, real *dif, + real *work, integer *lwork, integer *iwork, integer *liwork, integer * + info); + +/* Subroutine */ int stgsja_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, integer *k, integer *l, real *a, integer *lda, + real *b, integer *ldb, real *tola, real *tolb, real *alpha, real * + beta, real *u, integer *ldu, real *v, integer *ldv, real *q, integer * + ldq, real *work, integer *ncycle, integer *info); + +/* Subroutine */ int stgsna_(char *job, char *howmny, logical *select, + integer *n, real *a, integer *lda, real *b, integer *ldb, real *vl, + integer *ldvl, real *vr, integer *ldvr, real *s, real *dif, integer * + mm, integer *m, real *work, integer *lwork, integer *iwork, integer * + info); + +/* Subroutine */ int stgsy2_(char *trans, integer *ijob, integer *m, integer * + n, real *a, integer *lda, real *b, integer *ldb, real *c__, integer * + ldc, real *d__, integer *ldd, real *e, integer *lde, real *f, integer + *ldf, real *scale, real *rdsum, real *rdscal, integer *iwork, integer + *pq, integer *info); + +/* Subroutine */ int stgsyl_(char *trans, integer *ijob, integer *m, integer * + n, real *a, integer *lda, real *b, integer *ldb, real *c__, integer * + ldc, real *d__, integer *ldd, real *e, integer *lde, real *f, integer + *ldf, real *scale, real *dif, real *work, integer *lwork, integer * + iwork, integer *info); + +/* Subroutine */ int stpcon_(char *norm, char *uplo, char *diag, integer *n, + real *ap, real *rcond, real *work, integer *iwork, integer *info); + +/* Subroutine */ int stprfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, real *ap, real *b, integer *ldb, real *x, integer *ldx, + real *ferr, real *berr, real *work, integer *iwork, integer *info); + +/* Subroutine */ int stptri_(char *uplo, char *diag, integer *n, real *ap, + integer *info); + +/* Subroutine */ int stptrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, real *ap, real *b, integer *ldb, integer *info); + +/* Subroutine */ int strcon_(char *norm, char *uplo, char *diag, integer *n, + real *a, integer *lda, real *rcond, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int strevc_(char *side, char *howmny, logical *select, + integer *n, real *t, integer *ldt, real *vl, integer *ldvl, real *vr, + integer *ldvr, integer *mm, integer *m, real *work, integer *info); + +/* Subroutine */ int strexc_(char *compq, integer *n, real *t, integer *ldt, + real *q, integer *ldq, integer *ifst, integer *ilst, real *work, + integer *info); + +/* Subroutine */ int strrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, real *a, integer *lda, real *b, integer *ldb, real *x, + integer *ldx, real *ferr, real *berr, real *work, integer *iwork, + integer *info); + +/* Subroutine */ int strsen_(char *job, char *compq, logical *select, integer + *n, real *t, integer *ldt, real *q, integer *ldq, real *wr, real *wi, + integer *m, real *s, real *sep, real *work, integer *lwork, integer * + iwork, integer *liwork, integer *info); + +/* Subroutine */ int strsna_(char *job, char *howmny, logical *select, + integer *n, real *t, integer *ldt, real *vl, integer *ldvl, real *vr, + integer *ldvr, real *s, real *sep, integer *mm, integer *m, real * + work, integer *ldwork, integer *iwork, integer *info); + +/* Subroutine */ int strsyl_(char *trana, char *tranb, integer *isgn, integer + *m, integer *n, real *a, integer *lda, real *b, integer *ldb, real * + c__, integer *ldc, real *scale, integer *info); + +/* Subroutine */ int strti2_(char *uplo, char *diag, integer *n, real *a, + integer *lda, integer *info); + +/* Subroutine */ int strtri_(char *uplo, char *diag, integer *n, real *a, + integer *lda, integer *info); + +/* Subroutine */ int strtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, real *a, integer *lda, real *b, integer *ldb, integer * + info); + +/* Subroutine */ int stzrqf_(integer *m, integer *n, real *a, integer *lda, + real *tau, integer *info); + +/* Subroutine */ int stzrzf_(integer *m, integer *n, real *a, integer *lda, + real *tau, real *work, integer *lwork, integer *info); + +/* Subroutine */ int xerbla_(char *srname, integer *info); + +/* Subroutine */ int zbdsqr_(char *uplo, integer *n, integer *ncvt, integer * + nru, integer *ncc, doublereal *d__, doublereal *e, doublecomplex *vt, + integer *ldvt, doublecomplex *u, integer *ldu, doublecomplex *c__, + integer *ldc, doublereal *rwork, integer *info); + +/* Subroutine */ int zcgesv_(integer *n, integer *nrhs, doublecomplex *a, + integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublecomplex *work, complex *swork, + integer *iter, integer *info); + +/* Subroutine */ int zdrscl_(integer *n, doublereal *sa, doublecomplex *sx, + integer *incx); + +/* Subroutine */ int zgbbrd_(char *vect, integer *m, integer *n, integer *ncc, + integer *kl, integer *ku, doublecomplex *ab, integer *ldab, + doublereal *d__, doublereal *e, doublecomplex *q, integer *ldq, + doublecomplex *pt, integer *ldpt, doublecomplex *c__, integer *ldc, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zgbcon_(char *norm, integer *n, integer *kl, integer *ku, + doublecomplex *ab, integer *ldab, integer *ipiv, doublereal *anorm, + doublereal *rcond, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zgbequ_(integer *m, integer *n, integer *kl, integer *ku, + doublecomplex *ab, integer *ldab, doublereal *r__, doublereal *c__, + doublereal *rowcnd, doublereal *colcnd, doublereal *amax, integer * + info); + +/* Subroutine */ int zgbrfs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex * + afb, integer *ldafb, integer *ipiv, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zgbsv_(integer *n, integer *kl, integer *ku, integer * + nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, doublecomplex * + b, integer *ldb, integer *info); + +/* Subroutine */ int zgbsvx_(char *fact, char *trans, integer *n, integer *kl, + integer *ku, integer *nrhs, doublecomplex *ab, integer *ldab, + doublecomplex *afb, integer *ldafb, integer *ipiv, char *equed, + doublereal *r__, doublereal *c__, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, + doublereal *berr, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zgbtf2_(integer *m, integer *n, integer *kl, integer *ku, + doublecomplex *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int zgbtrf_(integer *m, integer *n, integer *kl, integer *ku, + doublecomplex *ab, integer *ldab, integer *ipiv, integer *info); + +/* Subroutine */ int zgbtrs_(char *trans, integer *n, integer *kl, integer * + ku, integer *nrhs, doublecomplex *ab, integer *ldab, integer *ipiv, + doublecomplex *b, integer *ldb, integer *info); + +/* Subroutine */ int zgebak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, doublereal *scale, integer *m, doublecomplex *v, + integer *ldv, integer *info); + +/* Subroutine */ int zgebal_(char *job, integer *n, doublecomplex *a, integer + *lda, integer *ilo, integer *ihi, doublereal *scale, integer *info); + +/* Subroutine */ int zgebd2_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, + doublecomplex *taup, doublecomplex *work, integer *info); + +/* Subroutine */ int zgebrd_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tauq, + doublecomplex *taup, doublecomplex *work, integer *lwork, integer * + info); + +/* Subroutine */ int zgecon_(char *norm, integer *n, doublecomplex *a, + integer *lda, doublereal *anorm, doublereal *rcond, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zgeequ_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, + doublereal *colcnd, doublereal *amax, integer *info); + +/* Subroutine */ int zgees_(char *jobvs, char *sort, L_fp select, integer *n, + doublecomplex *a, integer *lda, integer *sdim, doublecomplex *w, + doublecomplex *vs, integer *ldvs, doublecomplex *work, integer *lwork, + doublereal *rwork, logical *bwork, integer *info); + +/* Subroutine */ int zgeesx_(char *jobvs, char *sort, L_fp select, char * + sense, integer *n, doublecomplex *a, integer *lda, integer *sdim, + doublecomplex *w, doublecomplex *vs, integer *ldvs, doublereal * + rconde, doublereal *rcondv, doublecomplex *work, integer *lwork, + doublereal *rwork, logical *bwork, integer *info); + +/* Subroutine */ int zgeev_(char *jobvl, char *jobvr, integer *n, + doublecomplex *a, integer *lda, doublecomplex *w, doublecomplex *vl, + integer *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgeevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *w, + doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, + integer *ilo, integer *ihi, doublereal *scale, doublereal *abnrm, + doublereal *rconde, doublereal *rcondv, doublecomplex *work, integer * + lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgegs_(char *jobvsl, char *jobvsr, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *alpha, doublecomplex *beta, doublecomplex *vsl, + integer *ldvsl, doublecomplex *vsr, integer *ldvsr, doublecomplex * + work, integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgegv_(char *jobvl, char *jobvr, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer + *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer + *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgehd2_(integer *n, integer *ilo, integer *ihi, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info); + +/* Subroutine */ int zgehrd_(integer *n, integer *ilo, integer *ihi, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zgelq2_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); + +/* Subroutine */ int zgelqf_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zgels_(char *trans, integer *m, integer *n, integer * + nrhs, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zgelsd_(integer *m, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublereal *s, doublereal *rcond, integer *rank, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *iwork, integer *info); + +/* Subroutine */ int zgelss_(integer *m, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublereal *s, doublereal *rcond, integer *rank, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgelsx_(integer *m, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + integer *jpvt, doublereal *rcond, integer *rank, doublecomplex *work, + doublereal *rwork, integer *info); + +/* Subroutine */ int zgelsy_(integer *m, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + integer *jpvt, doublereal *rcond, integer *rank, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgeql2_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); + +/* Subroutine */ int zgeqlf_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zgeqp3_(integer *m, integer *n, doublecomplex *a, + integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgeqpf_(integer *m, integer *n, doublecomplex *a, + integer *lda, integer *jpvt, doublecomplex *tau, doublecomplex *work, + doublereal *rwork, integer *info); + +/* Subroutine */ int zgeqr2_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); + +/* Subroutine */ int zgeqrf_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zgerfs_(char *trans, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, + integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, + integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, + doublereal *rwork, integer *info); + +/* Subroutine */ int zgerq2_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *info); + +/* Subroutine */ int zgerqf_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zgesc2_(integer *n, doublecomplex *a, integer *lda, + doublecomplex *rhs, integer *ipiv, integer *jpiv, doublereal *scale); + +/* Subroutine */ int zgesdd_(char *jobz, integer *m, integer *n, + doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, + integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *iwork, integer *info); + +/* Subroutine */ int zgesv_(integer *n, integer *nrhs, doublecomplex *a, + integer *lda, integer *ipiv, doublecomplex *b, integer *ldb, integer * + info); + +/* Subroutine */ int zgesvd_(char *jobu, char *jobvt, integer *m, integer *n, + doublecomplex *a, integer *lda, doublereal *s, doublecomplex *u, + integer *ldu, doublecomplex *vt, integer *ldvt, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zgesvx_(char *fact, char *trans, integer *n, integer * + nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * + ldaf, integer *ipiv, char *equed, doublereal *r__, doublereal *c__, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zgetc2_(integer *n, doublecomplex *a, integer *lda, + integer *ipiv, integer *jpiv, integer *info); + +/* Subroutine */ int zgetf2_(integer *m, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, integer *info); + +/* Subroutine */ int zgetrf_(integer *m, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, integer *info); + +/* Subroutine */ int zgetri_(integer *n, doublecomplex *a, integer *lda, + integer *ipiv, doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zgetrs_(char *trans, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, + integer *ldb, integer *info); + +/* Subroutine */ int zggbak_(char *job, char *side, integer *n, integer *ilo, + integer *ihi, doublereal *lscale, doublereal *rscale, integer *m, + doublecomplex *v, integer *ldv, integer *info); + +/* Subroutine */ int zggbal_(char *job, integer *n, doublecomplex *a, integer + *lda, doublecomplex *b, integer *ldb, integer *ilo, integer *ihi, + doublereal *lscale, doublereal *rscale, doublereal *work, integer * + info); + +/* Subroutine */ int zgges_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, integer *sdim, doublecomplex *alpha, doublecomplex * + beta, doublecomplex *vsl, integer *ldvsl, doublecomplex *vsr, integer + *ldvsr, doublecomplex *work, integer *lwork, doublereal *rwork, + logical *bwork, integer *info); + +/* Subroutine */ int zggesx_(char *jobvsl, char *jobvsr, char *sort, L_fp + selctg, char *sense, integer *n, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, integer *sdim, doublecomplex *alpha, + doublecomplex *beta, doublecomplex *vsl, integer *ldvsl, + doublecomplex *vsr, integer *ldvsr, doublereal *rconde, doublereal * + rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, + integer *iwork, integer *liwork, logical *bwork, integer *info); + +/* Subroutine */ int zggev_(char *jobvl, char *jobvr, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *alpha, doublecomplex *beta, doublecomplex *vl, integer + *ldvl, doublecomplex *vr, integer *ldvr, doublecomplex *work, integer + *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zggevx_(char *balanc, char *jobvl, char *jobvr, char * + sense, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, doublecomplex *alpha, doublecomplex *beta, + doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, + integer *ilo, integer *ihi, doublereal *lscale, doublereal *rscale, + doublereal *abnrm, doublereal *bbnrm, doublereal *rconde, doublereal * + rcondv, doublecomplex *work, integer *lwork, doublereal *rwork, + integer *iwork, logical *bwork, integer *info); + +/* Subroutine */ int zggglm_(integer *n, integer *m, integer *p, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *d__, doublecomplex *x, doublecomplex *y, doublecomplex + *work, integer *lwork, integer *info); + +/* Subroutine */ int zgghrd_(char *compq, char *compz, integer *n, integer * + ilo, integer *ihi, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, doublecomplex *q, integer *ldq, doublecomplex *z__, + integer *ldz, integer *info); + +/* Subroutine */ int zgglse_(integer *m, integer *n, integer *p, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *c__, doublecomplex *d__, doublecomplex *x, + doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zggqrf_(integer *n, integer *m, integer *p, + doublecomplex *a, integer *lda, doublecomplex *taua, doublecomplex *b, + integer *ldb, doublecomplex *taub, doublecomplex *work, integer * + lwork, integer *info); + +/* Subroutine */ int zggrqf_(integer *m, integer *p, integer *n, + doublecomplex *a, integer *lda, doublecomplex *taua, doublecomplex *b, + integer *ldb, doublecomplex *taub, doublecomplex *work, integer * + lwork, integer *info); + +/* Subroutine */ int zggsvd_(char *jobu, char *jobv, char *jobq, integer *m, + integer *n, integer *p, integer *k, integer *l, doublecomplex *a, + integer *lda, doublecomplex *b, integer *ldb, doublereal *alpha, + doublereal *beta, doublecomplex *u, integer *ldu, doublecomplex *v, + integer *ldv, doublecomplex *q, integer *ldq, doublecomplex *work, + doublereal *rwork, integer *iwork, integer *info); + +/* Subroutine */ int zggsvp_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, doublecomplex *a, integer *lda, doublecomplex + *b, integer *ldb, doublereal *tola, doublereal *tolb, integer *k, + integer *l, doublecomplex *u, integer *ldu, doublecomplex *v, integer + *ldv, doublecomplex *q, integer *ldq, integer *iwork, doublereal * + rwork, doublecomplex *tau, doublecomplex *work, integer *info); + +/* Subroutine */ int zgtcon_(char *norm, integer *n, doublecomplex *dl, + doublecomplex *d__, doublecomplex *du, doublecomplex *du2, integer * + ipiv, doublereal *anorm, doublereal *rcond, doublecomplex *work, + integer *info); + +/* Subroutine */ int zgtrfs_(char *trans, integer *n, integer *nrhs, + doublecomplex *dl, doublecomplex *d__, doublecomplex *du, + doublecomplex *dlf, doublecomplex *df, doublecomplex *duf, + doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zgtsv_(integer *n, integer *nrhs, doublecomplex *dl, + doublecomplex *d__, doublecomplex *du, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zgtsvx_(char *fact, char *trans, integer *n, integer * + nrhs, doublecomplex *dl, doublecomplex *d__, doublecomplex *du, + doublecomplex *dlf, doublecomplex *df, doublecomplex *duf, + doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, + doublereal *berr, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zgttrf_(integer *n, doublecomplex *dl, doublecomplex * + d__, doublecomplex *du, doublecomplex *du2, integer *ipiv, integer * + info); + +/* Subroutine */ int zgttrs_(char *trans, integer *n, integer *nrhs, + doublecomplex *dl, doublecomplex *d__, doublecomplex *du, + doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zgtts2_(integer *itrans, integer *n, integer *nrhs, + doublecomplex *dl, doublecomplex *d__, doublecomplex *du, + doublecomplex *du2, integer *ipiv, doublecomplex *b, integer *ldb); + +/* Subroutine */ int zhbev_(char *jobz, char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, + integer *ldz, doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zhbevd_(char *jobz, char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *w, doublecomplex *z__, + integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, + integer *lrwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int zhbevx_(char *jobz, char *range, char *uplo, integer *n, + integer *kd, doublecomplex *ab, integer *ldab, doublecomplex *q, + integer *ldq, doublereal *vl, doublereal *vu, integer *il, integer * + iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, + integer *ldz, doublecomplex *work, doublereal *rwork, integer *iwork, + integer *ifail, integer *info); + +/* Subroutine */ int zhbgst_(char *vect, char *uplo, integer *n, integer *ka, + integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, + integer *ldbb, doublecomplex *x, integer *ldx, doublecomplex *work, + doublereal *rwork, integer *info); + +/* Subroutine */ int zhbgv_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, + integer *ldbb, doublereal *w, doublecomplex *z__, integer *ldz, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zhbgvd_(char *jobz, char *uplo, integer *n, integer *ka, + integer *kb, doublecomplex *ab, integer *ldab, doublecomplex *bb, + integer *ldbb, doublereal *w, doublecomplex *z__, integer *ldz, + doublecomplex *work, integer *lwork, doublereal *rwork, integer * + lrwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int zhbgvx_(char *jobz, char *range, char *uplo, integer *n, + integer *ka, integer *kb, doublecomplex *ab, integer *ldab, + doublecomplex *bb, integer *ldbb, doublecomplex *q, integer *ldq, + doublereal *vl, doublereal *vu, integer *il, integer *iu, doublereal * + abstol, integer *m, doublereal *w, doublecomplex *z__, integer *ldz, + doublecomplex *work, doublereal *rwork, integer *iwork, integer * + ifail, integer *info); + +/* Subroutine */ int zhbtrd_(char *vect, char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *d__, doublereal *e, + doublecomplex *q, integer *ldq, doublecomplex *work, integer *info); + +/* Subroutine */ int zhecon_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, doublereal *anorm, doublereal *rcond, + doublecomplex *work, integer *info); + +/* Subroutine */ int zheev_(char *jobz, char *uplo, integer *n, doublecomplex + *a, integer *lda, doublereal *w, doublecomplex *work, integer *lwork, + doublereal *rwork, integer *info); + +/* Subroutine */ int zheevd_(char *jobz, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublereal *w, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int zheevr_(char *jobz, char *range, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, + integer *il, integer *iu, doublereal *abstol, integer *m, doublereal * + w, doublecomplex *z__, integer *ldz, integer *isuppz, doublecomplex * + work, integer *lwork, doublereal *rwork, integer *lrwork, integer * + iwork, integer *liwork, integer *info); + +/* Subroutine */ int zheevx_(char *jobz, char *range, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublereal *vl, doublereal *vu, + integer *il, integer *iu, doublereal *abstol, integer *m, doublereal * + w, doublecomplex *z__, integer *ldz, doublecomplex *work, integer * + lwork, doublereal *rwork, integer *iwork, integer *ifail, integer * + info); + +/* Subroutine */ int zhegs2_(integer *itype, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zhegst_(integer *itype, char *uplo, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zhegv_(integer *itype, char *jobz, char *uplo, integer * + n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, + integer *info); + +/* Subroutine */ int zhegvd_(integer *itype, char *jobz, char *uplo, integer * + n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublereal *w, doublecomplex *work, integer *lwork, doublereal *rwork, + integer *lrwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int zhegvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, doublereal *vl, doublereal *vu, integer *il, integer * + iu, doublereal *abstol, integer *m, doublereal *w, doublecomplex *z__, + integer *ldz, doublecomplex *work, integer *lwork, doublereal *rwork, + integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int zherfs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, + integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, + integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, + doublereal *rwork, integer *info); + +/* Subroutine */ int zhesv_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, + integer *ldb, doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zhesvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * + ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, + integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, + doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zhetd2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, + integer *info); + +/* Subroutine */ int zhetf2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, integer *info); + +/* Subroutine */ int zhetrd_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *d__, doublereal *e, doublecomplex *tau, + doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zhetrf_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zhetri_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, doublecomplex *work, integer *info); + +/* Subroutine */ int zhetrs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, + integer *ldb, integer *info); + +/* Subroutine */ int zhgeqz_(char *job, char *compq, char *compz, integer *n, + integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, + doublecomplex *t, integer *ldt, doublecomplex *alpha, doublecomplex * + beta, doublecomplex *q, integer *ldq, doublecomplex *z__, integer * + ldz, doublecomplex *work, integer *lwork, doublereal *rwork, integer * + info); + +/* Subroutine */ int zhpcon_(char *uplo, integer *n, doublecomplex *ap, + integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex * + work, integer *info); + +/* Subroutine */ int zhpev_(char *jobz, char *uplo, integer *n, doublecomplex + *ap, doublereal *w, doublecomplex *z__, integer *ldz, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zhpevd_(char *jobz, char *uplo, integer *n, + doublecomplex *ap, doublereal *w, doublecomplex *z__, integer *ldz, + doublecomplex *work, integer *lwork, doublereal *rwork, integer * + lrwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int zhpevx_(char *jobz, char *range, char *uplo, integer *n, + doublecomplex *ap, doublereal *vl, doublereal *vu, integer *il, + integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublecomplex *z__, integer *ldz, doublecomplex *work, doublereal * + rwork, integer *iwork, integer *ifail, integer *info); + +/* Subroutine */ int zhpgst_(integer *itype, char *uplo, integer *n, + doublecomplex *ap, doublecomplex *bp, integer *info); + +/* Subroutine */ int zhpgv_(integer *itype, char *jobz, char *uplo, integer * + n, doublecomplex *ap, doublecomplex *bp, doublereal *w, doublecomplex + *z__, integer *ldz, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zhpgvd_(integer *itype, char *jobz, char *uplo, integer * + n, doublecomplex *ap, doublecomplex *bp, doublereal *w, doublecomplex + *z__, integer *ldz, doublecomplex *work, integer *lwork, doublereal * + rwork, integer *lrwork, integer *iwork, integer *liwork, integer * + info); + +/* Subroutine */ int zhpgvx_(integer *itype, char *jobz, char *range, char * + uplo, integer *n, doublecomplex *ap, doublecomplex *bp, doublereal * + vl, doublereal *vu, integer *il, integer *iu, doublereal *abstol, + integer *m, doublereal *w, doublecomplex *z__, integer *ldz, + doublecomplex *work, doublereal *rwork, integer *iwork, integer * + ifail, integer *info); + +/* Subroutine */ int zhprfs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex * + b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, + doublereal *berr, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zhpsv_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zhpsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zhptrd_(char *uplo, integer *n, doublecomplex *ap, + doublereal *d__, doublereal *e, doublecomplex *tau, integer *info); + +/* Subroutine */ int zhptrf_(char *uplo, integer *n, doublecomplex *ap, + integer *ipiv, integer *info); + +/* Subroutine */ int zhptri_(char *uplo, integer *n, doublecomplex *ap, + integer *ipiv, doublecomplex *work, integer *info); + +/* Subroutine */ int zhptrs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zhsein_(char *side, char *eigsrc, char *initv, logical * + select, integer *n, doublecomplex *h__, integer *ldh, doublecomplex * + w, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer *ldvr, + integer *mm, integer *m, doublecomplex *work, doublereal *rwork, + integer *ifaill, integer *ifailr, integer *info); + +/* Subroutine */ int zhseqr_(char *job, char *compz, integer *n, integer *ilo, + integer *ihi, doublecomplex *h__, integer *ldh, doublecomplex *w, + doublecomplex *z__, integer *ldz, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zlabrd_(integer *m, integer *n, integer *nb, + doublecomplex *a, integer *lda, doublereal *d__, doublereal *e, + doublecomplex *tauq, doublecomplex *taup, doublecomplex *x, integer * + ldx, doublecomplex *y, integer *ldy); + +/* Subroutine */ int zlacgv_(integer *n, doublecomplex *x, integer *incx); + +/* Subroutine */ int zlacn2_(integer *n, doublecomplex *v, doublecomplex *x, + doublereal *est, integer *kase, integer *isave); + +/* Subroutine */ int zlacon_(integer *n, doublecomplex *v, doublecomplex *x, + doublereal *est, integer *kase); + +/* Subroutine */ int zlacp2_(char *uplo, integer *m, integer *n, doublereal * + a, integer *lda, doublecomplex *b, integer *ldb); + +/* Subroutine */ int zlacpy_(char *uplo, integer *m, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb); + +/* Subroutine */ int zlacrm_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *b, integer *ldb, doublecomplex *c__, + integer *ldc, doublereal *rwork); + +/* Subroutine */ int zlacrt_(integer *n, doublecomplex *cx, integer *incx, + doublecomplex *cy, integer *incy, doublecomplex *c__, doublecomplex * + s); + +/* Double Complex */ VOID zladiv_(doublecomplex * ret_val, doublecomplex *x, + doublecomplex *y); + +/* Subroutine */ int zlaed0_(integer *qsiz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *q, integer *ldq, doublecomplex *qstore, + integer *ldqs, doublereal *rwork, integer *iwork, integer *info); + +/* Subroutine */ int zlaed7_(integer *n, integer *cutpnt, integer *qsiz, + integer *tlvls, integer *curlvl, integer *curpbm, doublereal *d__, + doublecomplex *q, integer *ldq, doublereal *rho, integer *indxq, + doublereal *qstore, integer *qptr, integer *prmptr, integer *perm, + integer *givptr, integer *givcol, doublereal *givnum, doublecomplex * + work, doublereal *rwork, integer *iwork, integer *info); + +/* Subroutine */ int zlaed8_(integer *k, integer *n, integer *qsiz, + doublecomplex *q, integer *ldq, doublereal *d__, doublereal *rho, + integer *cutpnt, doublereal *z__, doublereal *dlamda, doublecomplex * + q2, integer *ldq2, doublereal *w, integer *indxp, integer *indx, + integer *indxq, integer *perm, integer *givptr, integer *givcol, + doublereal *givnum, integer *info); + +/* Subroutine */ int zlaein_(logical *rightv, logical *noinit, integer *n, + doublecomplex *h__, integer *ldh, doublecomplex *w, doublecomplex *v, + doublecomplex *b, integer *ldb, doublereal *rwork, doublereal *eps3, + doublereal *smlnum, integer *info); + +/* Subroutine */ int zlaesy_(doublecomplex *a, doublecomplex *b, + doublecomplex *c__, doublecomplex *rt1, doublecomplex *rt2, + doublecomplex *evscal, doublecomplex *cs1, doublecomplex *sn1); + +/* Subroutine */ int zlaev2_(doublecomplex *a, doublecomplex *b, + doublecomplex *c__, doublereal *rt1, doublereal *rt2, doublereal *cs1, + doublecomplex *sn1); + +/* Subroutine */ int zlag2c_(integer *m, integer *n, doublecomplex *a, + integer *lda, complex *sa, integer *ldsa, integer *info); + +/* Subroutine */ int zlags2_(logical *upper, doublereal *a1, doublecomplex * + a2, doublereal *a3, doublereal *b1, doublecomplex *b2, doublereal *b3, + doublereal *csu, doublecomplex *snu, doublereal *csv, doublecomplex * + snv, doublereal *csq, doublecomplex *snq); + +/* Subroutine */ int zlagtm_(char *trans, integer *n, integer *nrhs, + doublereal *alpha, doublecomplex *dl, doublecomplex *d__, + doublecomplex *du, doublecomplex *x, integer *ldx, doublereal *beta, + doublecomplex *b, integer *ldb); + +/* Subroutine */ int zlahef_(char *uplo, integer *n, integer *nb, integer *kb, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *w, + integer *ldw, integer *info); + +/* Subroutine */ int zlahqr_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, + doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, + integer *ldz, integer *info); + +/* Subroutine */ int zlahr2_(integer *n, integer *k, integer *nb, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *t, + integer *ldt, doublecomplex *y, integer *ldy); + +/* Subroutine */ int zlahrd_(integer *n, integer *k, integer *nb, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex *t, + integer *ldt, doublecomplex *y, integer *ldy); + +/* Subroutine */ int zlaic1_(integer *job, integer *j, doublecomplex *x, + doublereal *sest, doublecomplex *w, doublecomplex *gamma, doublereal * + sestpr, doublecomplex *s, doublecomplex *c__); + +/* Subroutine */ int zlals0_(integer *icompq, integer *nl, integer *nr, + integer *sqre, integer *nrhs, doublecomplex *b, integer *ldb, + doublecomplex *bx, integer *ldbx, integer *perm, integer *givptr, + integer *givcol, integer *ldgcol, doublereal *givnum, integer *ldgnum, + doublereal *poles, doublereal *difl, doublereal *difr, doublereal * + z__, integer *k, doublereal *c__, doublereal *s, doublereal *rwork, + integer *info); + +/* Subroutine */ int zlalsa_(integer *icompq, integer *smlsiz, integer *n, + integer *nrhs, doublecomplex *b, integer *ldb, doublecomplex *bx, + integer *ldbx, doublereal *u, integer *ldu, doublereal *vt, integer * + k, doublereal *difl, doublereal *difr, doublereal *z__, doublereal * + poles, integer *givptr, integer *givcol, integer *ldgcol, integer * + perm, doublereal *givnum, doublereal *c__, doublereal *s, doublereal * + rwork, integer *iwork, integer *info); + +/* Subroutine */ int zlalsd_(char *uplo, integer *smlsiz, integer *n, integer + *nrhs, doublereal *d__, doublereal *e, doublecomplex *b, integer *ldb, + doublereal *rcond, integer *rank, doublecomplex *work, doublereal * + rwork, integer *iwork, integer *info); + +/* Subroutine */ int zlapll_(integer *n, doublecomplex *x, integer *incx, + doublecomplex *y, integer *incy, doublereal *ssmin); + +/* Subroutine */ int zlapmt_(logical *forwrd, integer *m, integer *n, + doublecomplex *x, integer *ldx, integer *k); + +/* Subroutine */ int zlaqgb_(integer *m, integer *n, integer *kl, integer *ku, + doublecomplex *ab, integer *ldab, doublereal *r__, doublereal *c__, + doublereal *rowcnd, doublereal *colcnd, doublereal *amax, char *equed); + +/* Subroutine */ int zlaqge_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublereal *r__, doublereal *c__, doublereal *rowcnd, + doublereal *colcnd, doublereal *amax, char *equed); + +/* Subroutine */ int zlaqhb_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, + doublereal *amax, char *equed); + +/* Subroutine */ int zlaqhe_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *s, doublereal *scond, doublereal *amax, + char *equed); + +/* Subroutine */ int zlaqhp_(char *uplo, integer *n, doublecomplex *ap, + doublereal *s, doublereal *scond, doublereal *amax, char *equed); + +/* Subroutine */ int zlaqp2_(integer *m, integer *n, integer *offset, + doublecomplex *a, integer *lda, integer *jpvt, doublecomplex *tau, + doublereal *vn1, doublereal *vn2, doublecomplex *work); + +/* Subroutine */ int zlaqps_(integer *m, integer *n, integer *offset, integer + *nb, integer *kb, doublecomplex *a, integer *lda, integer *jpvt, + doublecomplex *tau, doublereal *vn1, doublereal *vn2, doublecomplex * + auxv, doublecomplex *f, integer *ldf); + +/* Subroutine */ int zlaqr0_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, + doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, + integer *ldz, doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zlaqr1_(integer *n, doublecomplex *h__, integer *ldh, + doublecomplex *s1, doublecomplex *s2, doublecomplex *v); + +/* Subroutine */ int zlaqr2_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, doublecomplex *h__, + integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, + integer *ldz, integer *ns, integer *nd, doublecomplex *sh, + doublecomplex *v, integer *ldv, integer *nh, doublecomplex *t, + integer *ldt, integer *nv, doublecomplex *wv, integer *ldwv, + doublecomplex *work, integer *lwork); + +/* Subroutine */ int zlaqr3_(logical *wantt, logical *wantz, integer *n, + integer *ktop, integer *kbot, integer *nw, doublecomplex *h__, + integer *ldh, integer *iloz, integer *ihiz, doublecomplex *z__, + integer *ldz, integer *ns, integer *nd, doublecomplex *sh, + doublecomplex *v, integer *ldv, integer *nh, doublecomplex *t, + integer *ldt, integer *nv, doublecomplex *wv, integer *ldwv, + doublecomplex *work, integer *lwork); + +/* Subroutine */ int zlaqr4_(logical *wantt, logical *wantz, integer *n, + integer *ilo, integer *ihi, doublecomplex *h__, integer *ldh, + doublecomplex *w, integer *iloz, integer *ihiz, doublecomplex *z__, + integer *ldz, doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zlaqr5_(logical *wantt, logical *wantz, integer *kacc22, + integer *n, integer *ktop, integer *kbot, integer *nshfts, + doublecomplex *s, doublecomplex *h__, integer *ldh, integer *iloz, + integer *ihiz, doublecomplex *z__, integer *ldz, doublecomplex *v, + integer *ldv, doublecomplex *u, integer *ldu, integer *nv, + doublecomplex *wv, integer *ldwv, integer *nh, doublecomplex *wh, + integer *ldwh); + +/* Subroutine */ int zlaqsb_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, + doublereal *amax, char *equed); + +/* Subroutine */ int zlaqsp_(char *uplo, integer *n, doublecomplex *ap, + doublereal *s, doublereal *scond, doublereal *amax, char *equed); + +/* Subroutine */ int zlaqsy_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *s, doublereal *scond, doublereal *amax, + char *equed); + +/* Subroutine */ int zlar1v_(integer *n, integer *b1, integer *bn, doublereal + *lambda, doublereal *d__, doublereal *l, doublereal *ld, doublereal * + lld, doublereal *pivmin, doublereal *gaptol, doublecomplex *z__, + logical *wantnc, integer *negcnt, doublereal *ztz, doublereal *mingma, + integer *r__, integer *isuppz, doublereal *nrminv, doublereal *resid, + doublereal *rqcorr, doublereal *work); + +/* Subroutine */ int zlar2v_(integer *n, doublecomplex *x, doublecomplex *y, + doublecomplex *z__, integer *incx, doublereal *c__, doublecomplex *s, + integer *incc); + +/* Subroutine */ int zlarcm_(integer *m, integer *n, doublereal *a, integer * + lda, doublecomplex *b, integer *ldb, doublecomplex *c__, integer *ldc, + doublereal *rwork); + +/* Subroutine */ int zlarf_(char *side, integer *m, integer *n, doublecomplex + *v, integer *incv, doublecomplex *tau, doublecomplex *c__, integer * + ldc, doublecomplex *work); + +/* Subroutine */ int zlarfb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, doublecomplex *v, integer + *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, integer * + ldc, doublecomplex *work, integer *ldwork ); + +/* Subroutine */ int zlarfg_(integer *n, doublecomplex *alpha, doublecomplex * + x, integer *incx, doublecomplex *tau); + +/* Subroutine */ int zlarft_(char *direct, char *storev, integer *n, integer * + k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * + t, integer *ldt); + +/* Subroutine */ int zlarfx_(char *side, integer *m, integer *n, + doublecomplex *v, doublecomplex *tau, doublecomplex *c__, integer * + ldc, doublecomplex *work); + +/* Subroutine */ int zlargv_(integer *n, doublecomplex *x, integer *incx, + doublecomplex *y, integer *incy, doublereal *c__, integer *incc); + +/* Subroutine */ int zlarnv_(integer *idist, integer *iseed, integer *n, + doublecomplex *x); + +/* Subroutine */ int zlarrv_(integer *n, doublereal *vl, doublereal *vu, + doublereal *d__, doublereal *l, doublereal *pivmin, integer *isplit, + integer *m, integer *dol, integer *dou, doublereal *minrgp, + doublereal *rtol1, doublereal *rtol2, doublereal *w, doublereal *werr, + doublereal *wgap, integer *iblock, integer *indexw, doublereal *gers, + doublecomplex *z__, integer *ldz, integer *isuppz, doublereal *work, + integer *iwork, integer *info); + +/* Subroutine */ int zlartg_(doublecomplex *f, doublecomplex *g, doublereal * + cs, doublecomplex *sn, doublecomplex *r__); + +/* Subroutine */ int zlartv_(integer *n, doublecomplex *x, integer *incx, + doublecomplex *y, integer *incy, doublereal *c__, doublecomplex *s, + integer *incc); + +/* Subroutine */ int zlarz_(char *side, integer *m, integer *n, integer *l, + doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex * + c__, integer *ldc, doublecomplex *work); + +/* Subroutine */ int zlarzb_(char *side, char *trans, char *direct, char * + storev, integer *m, integer *n, integer *k, integer *l, doublecomplex + *v, integer *ldv, doublecomplex *t, integer *ldt, doublecomplex *c__, + integer *ldc, doublecomplex *work, integer *ldwork); + +/* Subroutine */ int zlarzt_(char *direct, char *storev, integer *n, integer * + k, doublecomplex *v, integer *ldv, doublecomplex *tau, doublecomplex * + t, integer *ldt); + +/* Subroutine */ int zlascl_(char *type__, integer *kl, integer *ku, + doublereal *cfrom, doublereal *cto, integer *m, integer *n, + doublecomplex *a, integer *lda, integer *info); + +/* Subroutine */ int zlaset_(char *uplo, integer *m, integer *n, + doublecomplex *alpha, doublecomplex *beta, doublecomplex *a, integer * + lda); + +/* Subroutine */ int zlasr_(char *side, char *pivot, char *direct, integer *m, + integer *n, doublereal *c__, doublereal *s, doublecomplex *a, + integer *lda); + +/* Subroutine */ int zlassq_(integer *n, doublecomplex *x, integer *incx, + doublereal *scale, doublereal *sumsq); + +/* Subroutine */ int zlaswp_(integer *n, doublecomplex *a, integer *lda, + integer *k1, integer *k2, integer *ipiv, integer *incx); + +/* Subroutine */ int zlasyf_(char *uplo, integer *n, integer *nb, integer *kb, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *w, + integer *ldw, integer *info); + +/* Subroutine */ int zlatbs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, integer *kd, doublecomplex *ab, integer *ldab, + doublecomplex *x, doublereal *scale, doublereal *cnorm, integer *info); + +/* Subroutine */ int zlatdf_(integer *ijob, integer *n, doublecomplex *z__, + integer *ldz, doublecomplex *rhs, doublereal *rdsum, doublereal * + rdscal, integer *ipiv, integer *jpiv); + +/* Subroutine */ int zlatps_(char *uplo, char *trans, char *diag, char * + normin, integer *n, doublecomplex *ap, doublecomplex *x, doublereal * + scale, doublereal *cnorm, integer *info); + +/* Subroutine */ int zlatrd_(char *uplo, integer *n, integer *nb, + doublecomplex *a, integer *lda, doublereal *e, doublecomplex *tau, + doublecomplex *w, integer *ldw); + +/* Subroutine */ int zlatrs_(char *uplo, char *trans, char *diag, char * + normin, integer *n, doublecomplex *a, integer *lda, doublecomplex *x, + doublereal *scale, doublereal *cnorm, integer *info); + +/* Subroutine */ int zlatrz_(integer *m, integer *n, integer *l, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work); + +/* Subroutine */ int zlatzm_(char *side, integer *m, integer *n, + doublecomplex *v, integer *incv, doublecomplex *tau, doublecomplex * + c1, doublecomplex *c2, integer *ldc, doublecomplex *work ); + +/* Subroutine */ int zlauu2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *info); + +/* Subroutine */ int zlauum_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *info); + +/* Subroutine */ int zpbcon_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *anorm, doublereal * + rcond, doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zpbequ_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, doublereal *s, doublereal *scond, + doublereal *amax, integer *info); + +/* Subroutine */ int zpbrfs_(char *uplo, integer *n, integer *kd, integer * + nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, integer * + ldafb, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * + rwork, integer *info); + +/* Subroutine */ int zpbstf_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, integer *info); + +/* Subroutine */ int zpbsv_(char *uplo, integer *n, integer *kd, integer * + nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer * + ldb, integer *info); + +/* Subroutine */ int zpbsvx_(char *fact, char *uplo, integer *n, integer *kd, + integer *nrhs, doublecomplex *ab, integer *ldab, doublecomplex *afb, + integer *ldafb, char *equed, doublereal *s, doublecomplex *b, integer + *ldb, doublecomplex *x, integer *ldx, doublereal *rcond, doublereal * + ferr, doublereal *berr, doublecomplex *work, doublereal *rwork, + integer *info); + +/* Subroutine */ int zpbtf2_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, integer *info); + +/* Subroutine */ int zpbtrf_(char *uplo, integer *n, integer *kd, + doublecomplex *ab, integer *ldab, integer *info); + +/* Subroutine */ int zpbtrs_(char *uplo, integer *n, integer *kd, integer * + nrhs, doublecomplex *ab, integer *ldab, doublecomplex *b, integer * + ldb, integer *info); + +/* Subroutine */ int zpocon_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublereal *anorm, doublereal *rcond, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zpoequ_(integer *n, doublecomplex *a, integer *lda, + doublereal *s, doublereal *scond, doublereal *amax, integer *info); + +/* Subroutine */ int zporfs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * + rwork, integer *info); + +/* Subroutine */ int zposv_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zposvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * + ldaf, char *equed, doublereal *s, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *rcond, doublereal *ferr, + doublereal *berr, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zpotf2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *info); + +/* Subroutine */ int zpotrf_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *info); + +/* Subroutine */ int zpotri_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *info); + +/* Subroutine */ int zpotrs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zppcon_(char *uplo, integer *n, doublecomplex *ap, + doublereal *anorm, doublereal *rcond, doublecomplex *work, doublereal + *rwork, integer *info); + +/* Subroutine */ int zppequ_(char *uplo, integer *n, doublecomplex *ap, + doublereal *s, doublereal *scond, doublereal *amax, integer *info); + +/* Subroutine */ int zpprfs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, doublecomplex *afp, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int zppsv_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); + +/* Subroutine */ int zppsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublecomplex *ap, doublecomplex *afp, char *equed, doublereal * + s, doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zpptrf_(char *uplo, integer *n, doublecomplex *ap, + integer *info); + +/* Subroutine */ int zpptri_(char *uplo, integer *n, doublecomplex *ap, + integer *info); + +/* Subroutine */ int zpptrs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, doublecomplex *b, integer *ldb, integer *info); + +/* Subroutine */ int zptcon_(integer *n, doublereal *d__, doublecomplex *e, + doublereal *anorm, doublereal *rcond, doublereal *rwork, integer * + info); + +/* Subroutine */ int zpteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int zptrfs_(char *uplo, integer *n, integer *nrhs, + doublereal *d__, doublecomplex *e, doublereal *df, doublecomplex *ef, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * + rwork, integer *info); + +/* Subroutine */ int zptsv_(integer *n, integer *nrhs, doublereal *d__, + doublecomplex *e, doublecomplex *b, integer *ldb, integer *info); + +/* Subroutine */ int zptsvx_(char *fact, integer *n, integer *nrhs, + doublereal *d__, doublecomplex *e, doublereal *df, doublecomplex *ef, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zpttrf_(integer *n, doublereal *d__, doublecomplex *e, + integer *info); + +/* Subroutine */ int zpttrs_(char *uplo, integer *n, integer *nrhs, + doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zptts2_(integer *iuplo, integer *n, integer *nrhs, + doublereal *d__, doublecomplex *e, doublecomplex *b, integer *ldb); + +/* Subroutine */ int zrot_(integer *n, doublecomplex *cx, integer *incx, + doublecomplex *cy, integer *incy, doublereal *c__, doublecomplex *s); + +/* Subroutine */ int zspcon_(char *uplo, integer *n, doublecomplex *ap, + integer *ipiv, doublereal *anorm, doublereal *rcond, doublecomplex * + work, integer *info); + +/* Subroutine */ int zspmv_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *ap, doublecomplex *x, integer *incx, doublecomplex * + beta, doublecomplex *y, integer *incy); + +/* Subroutine */ int zspr_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *x, integer *incx, doublecomplex *ap); + +/* Subroutine */ int zsprfs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, doublecomplex *afp, integer *ipiv, doublecomplex * + b, integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, + doublereal *berr, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int zspsv_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zspsvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublecomplex *ap, doublecomplex *afp, integer *ipiv, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *rcond, doublereal *ferr, doublereal *berr, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int zsptrf_(char *uplo, integer *n, doublecomplex *ap, + integer *ipiv, integer *info); + +/* Subroutine */ int zsptri_(char *uplo, integer *n, doublecomplex *ap, + integer *ipiv, doublecomplex *work, integer *info); + +/* Subroutine */ int zsptrs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *ap, integer *ipiv, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int zstedc_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublecomplex *work, + integer *lwork, doublereal *rwork, integer *lrwork, integer *iwork, + integer *liwork, integer *info); + +/* Subroutine */ int zstegr_(char *jobz, char *range, integer *n, doublereal * + d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, + integer *iu, doublereal *abstol, integer *m, doublereal *w, + doublecomplex *z__, integer *ldz, integer *isuppz, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int zstein_(integer *n, doublereal *d__, doublereal *e, + integer *m, doublereal *w, integer *iblock, integer *isplit, + doublecomplex *z__, integer *ldz, doublereal *work, integer *iwork, + integer *ifail, integer *info); + +/* Subroutine */ int zstemr_(char *jobz, char *range, integer *n, doublereal * + d__, doublereal *e, doublereal *vl, doublereal *vu, integer *il, + integer *iu, integer *m, doublereal *w, doublecomplex *z__, integer * + ldz, integer *nzc, integer *isuppz, logical *tryrac, doublereal *work, + integer *lwork, integer *iwork, integer *liwork, integer *info); + +/* Subroutine */ int zsteqr_(char *compz, integer *n, doublereal *d__, + doublereal *e, doublecomplex *z__, integer *ldz, doublereal *work, + integer *info); + +/* Subroutine */ int zsycon_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, doublereal *anorm, doublereal *rcond, + doublecomplex *work, integer *info); + +/* Subroutine */ int zsymv_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *a, integer *lda, doublecomplex *x, integer *incx, + doublecomplex *beta, doublecomplex *y, integer *incy); + +/* Subroutine */ int zsyr_(char *uplo, integer *n, doublecomplex *alpha, + doublecomplex *x, integer *incx, doublecomplex *a, integer *lda); + +/* Subroutine */ int zsyrfs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, doublecomplex *af, integer *ldaf, + integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, + integer *ldx, doublereal *ferr, doublereal *berr, doublecomplex *work, + doublereal *rwork, integer *info); + +/* Subroutine */ int zsysv_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, + integer *ldb, doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int zsysvx_(char *fact, char *uplo, integer *n, integer * + nrhs, doublecomplex *a, integer *lda, doublecomplex *af, integer * + ldaf, integer *ipiv, doublecomplex *b, integer *ldb, doublecomplex *x, + integer *ldx, doublereal *rcond, doublereal *ferr, doublereal *berr, + doublecomplex *work, integer *lwork, doublereal *rwork, integer *info); + +/* Subroutine */ int zsytf2_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, integer *info); + +/* Subroutine */ int zsytrf_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zsytri_(char *uplo, integer *n, doublecomplex *a, + integer *lda, integer *ipiv, doublecomplex *work, integer *info); + +/* Subroutine */ int zsytrs_(char *uplo, integer *n, integer *nrhs, + doublecomplex *a, integer *lda, integer *ipiv, doublecomplex *b, + integer *ldb, integer *info); + +/* Subroutine */ int ztbcon_(char *norm, char *uplo, char *diag, integer *n, + integer *kd, doublecomplex *ab, integer *ldab, doublereal *rcond, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int ztbrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, + doublecomplex *b, integer *ldb, doublecomplex *x, integer *ldx, + doublereal *ferr, doublereal *berr, doublecomplex *work, doublereal * + rwork, integer *info); + +/* Subroutine */ int ztbtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *kd, integer *nrhs, doublecomplex *ab, integer *ldab, + doublecomplex *b, integer *ldb, integer *info); + +/* Subroutine */ int ztgevc_(char *side, char *howmny, logical *select, + integer *n, doublecomplex *s, integer *lds, doublecomplex *p, integer + *ldp, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer * + ldvr, integer *mm, integer *m, doublecomplex *work, doublereal *rwork, + integer *info); + +/* Subroutine */ int ztgex2_(logical *wantq, logical *wantz, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, + integer *j1, integer *info); + +/* Subroutine */ int ztgexc_(logical *wantq, logical *wantz, integer *n, + doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *q, integer *ldq, doublecomplex *z__, integer *ldz, + integer *ifst, integer *ilst, integer *info); + +/* Subroutine */ int ztgsen_(integer *ijob, logical *wantq, logical *wantz, + logical *select, integer *n, doublecomplex *a, integer *lda, + doublecomplex *b, integer *ldb, doublecomplex *alpha, doublecomplex * + beta, doublecomplex *q, integer *ldq, doublecomplex *z__, integer * + ldz, integer *m, doublereal *pl, doublereal *pr, doublereal *dif, + doublecomplex *work, integer *lwork, integer *iwork, integer *liwork, + integer *info); + +/* Subroutine */ int ztgsja_(char *jobu, char *jobv, char *jobq, integer *m, + integer *p, integer *n, integer *k, integer *l, doublecomplex *a, + integer *lda, doublecomplex *b, integer *ldb, doublereal *tola, + doublereal *tolb, doublereal *alpha, doublereal *beta, doublecomplex * + u, integer *ldu, doublecomplex *v, integer *ldv, doublecomplex *q, + integer *ldq, doublecomplex *work, integer *ncycle, integer *info); + +/* Subroutine */ int ztgsna_(char *job, char *howmny, logical *select, + integer *n, doublecomplex *a, integer *lda, doublecomplex *b, integer + *ldb, doublecomplex *vl, integer *ldvl, doublecomplex *vr, integer * + ldvr, doublereal *s, doublereal *dif, integer *mm, integer *m, + doublecomplex *work, integer *lwork, integer *iwork, integer *info); + +/* Subroutine */ int ztgsy2_(char *trans, integer *ijob, integer *m, integer * + n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd, + doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf, + doublereal *scale, doublereal *rdsum, doublereal *rdscal, integer * + info); + +/* Subroutine */ int ztgsyl_(char *trans, integer *ijob, integer *m, integer * + n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb, + doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd, + doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf, + doublereal *scale, doublereal *dif, doublecomplex *work, integer * + lwork, integer *iwork, integer *info); + +/* Subroutine */ int ztpcon_(char *norm, char *uplo, char *diag, integer *n, + doublecomplex *ap, doublereal *rcond, doublecomplex *work, doublereal + *rwork, integer *info); + +/* Subroutine */ int ztprfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, + doublecomplex *x, integer *ldx, doublereal *ferr, doublereal *berr, + doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int ztptri_(char *uplo, char *diag, integer *n, + doublecomplex *ap, integer *info); + +/* Subroutine */ int ztptrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublecomplex *ap, doublecomplex *b, integer *ldb, + integer *info); + +/* Subroutine */ int ztrcon_(char *norm, char *uplo, char *diag, integer *n, + doublecomplex *a, integer *lda, doublereal *rcond, doublecomplex * + work, doublereal *rwork, integer *info); + +/* Subroutine */ int ztrevc_(char *side, char *howmny, logical *select, + integer *n, doublecomplex *t, integer *ldt, doublecomplex *vl, + integer *ldvl, doublecomplex *vr, integer *ldvr, integer *mm, integer + *m, doublecomplex *work, doublereal *rwork, integer *info); + +/* Subroutine */ int ztrexc_(char *compq, integer *n, doublecomplex *t, + integer *ldt, doublecomplex *q, integer *ldq, integer *ifst, integer * + ilst, integer *info); + +/* Subroutine */ int ztrrfs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, doublecomplex *x, integer *ldx, doublereal *ferr, + doublereal *berr, doublecomplex *work, doublereal *rwork, integer * + info); + +/* Subroutine */ int ztrsen_(char *job, char *compq, logical *select, integer + *n, doublecomplex *t, integer *ldt, doublecomplex *q, integer *ldq, + doublecomplex *w, integer *m, doublereal *s, doublereal *sep, + doublecomplex *work, integer *lwork, integer *info); + +/* Subroutine */ int ztrsna_(char *job, char *howmny, logical *select, + integer *n, doublecomplex *t, integer *ldt, doublecomplex *vl, + integer *ldvl, doublecomplex *vr, integer *ldvr, doublereal *s, + doublereal *sep, integer *mm, integer *m, doublecomplex *work, + integer *ldwork, doublereal *rwork, integer *info); + +/* Subroutine */ int ztrsyl_(char *trana, char *tranb, integer *isgn, integer + *m, integer *n, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, doublecomplex *c__, integer *ldc, doublereal *scale, + integer *info); + +/* Subroutine */ int ztrti2_(char *uplo, char *diag, integer *n, + doublecomplex *a, integer *lda, integer *info); + +/* Subroutine */ int ztrtri_(char *uplo, char *diag, integer *n, + doublecomplex *a, integer *lda, integer *info); + +/* Subroutine */ int ztrtrs_(char *uplo, char *trans, char *diag, integer *n, + integer *nrhs, doublecomplex *a, integer *lda, doublecomplex *b, + integer *ldb, integer *info); + +/* Subroutine */ int ztzrqf_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, integer *info); + +/* Subroutine */ int ztzrzf_(integer *m, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zung2l_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info); + +/* Subroutine */ int zung2r_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info); + +/* Subroutine */ int zungbr_(char *vect, integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zunghr_(integer *n, integer *ilo, integer *ihi, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zungl2_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info); + +/* Subroutine */ int zunglq_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zungql_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zungqr_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zungr2_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *info); + +/* Subroutine */ int zungrq_(integer *m, integer *n, integer *k, + doublecomplex *a, integer *lda, doublecomplex *tau, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zungtr_(char *uplo, integer *n, doublecomplex *a, + integer *lda, doublecomplex *tau, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zunm2l_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); + +/* Subroutine */ int zunm2r_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); + +/* Subroutine */ int zunmbr_(char *vect, char *side, char *trans, integer *m, + integer *n, integer *k, doublecomplex *a, integer *lda, doublecomplex + *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * + lwork, integer *info); + +/* Subroutine */ int zunmhr_(char *side, char *trans, integer *m, integer *n, + integer *ilo, integer *ihi, doublecomplex *a, integer *lda, + doublecomplex *tau, doublecomplex *c__, integer *ldc, doublecomplex * + work, integer *lwork, integer *info); + +/* Subroutine */ int zunml2_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); + +/* Subroutine */ int zunmlq_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zunmql_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zunmqr_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zunmr2_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *info); + +/* Subroutine */ int zunmr3_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex + *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * + info); + +/* Subroutine */ int zunmrq_(char *side, char *trans, integer *m, integer *n, + integer *k, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zunmrz_(char *side, char *trans, integer *m, integer *n, + integer *k, integer *l, doublecomplex *a, integer *lda, doublecomplex + *tau, doublecomplex *c__, integer *ldc, doublecomplex *work, integer * + lwork, integer *info); + +/* Subroutine */ int zunmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublecomplex *a, integer *lda, doublecomplex *tau, + doublecomplex *c__, integer *ldc, doublecomplex *work, integer *lwork, + integer *info); + +/* Subroutine */ int zupgtr_(char *uplo, integer *n, doublecomplex *ap, + doublecomplex *tau, doublecomplex *q, integer *ldq, doublecomplex * + work, integer *info); + +/* Subroutine */ int zupmtr_(char *side, char *uplo, char *trans, integer *m, + integer *n, doublecomplex *ap, doublecomplex *tau, doublecomplex *c__, + integer *ldc, doublecomplex *work, integer *info); + +#endif /* __CLAPACK_H */ + diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/compiler.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/compiler.h new file mode 100644 index 0000000..706924c --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/compiler.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Levenberg - Marquardt non-linear minimization algorithm +// Copyright (C) 2004 Manolis Lourakis (lourakis at ics forth gr) +// Institute of Computer Science, Foundation for Research & Technology - Hellas +// Heraklion, Crete, Greece. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#ifndef _COMPILER_H_ +#define _COMPILER_H_ + +/* note: intel's icc defines both __ICC & __INTEL_COMPILER. + * Also, some compilers other than gcc define __GNUC__, + * therefore gcc should be checked last + */ +#ifdef _MSC_VER +#define inline __inline // MSVC +#elif !defined(__ICC) && !defined(__INTEL_COMPILER) && !defined(__GNUC__) +#define inline // other than MSVC, ICC, GCC: define empty +#endif + +#ifdef _MSC_VER +#define LM_FINITE _finite // MSVC +#elif defined(__ICC) || defined(__INTEL_COMPILER) || defined(__GNUC__) +#define LM_FINITE finite // ICC, GCC +#else +#define LM_FINITE finite // other than MSVC, ICC, GCC, let's hope this will work +#endif + +#ifdef _MSC_VER // avoid deprecation warnings in VS2005 +#define _CRT_SECURE_NO_WARNINGS +#endif + +#endif /* _COMPILER_H_ */ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/f2c.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/f2c.h new file mode 100644 index 0000000..b94ee7c --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/f2c.h @@ -0,0 +1,223 @@ +/* f2c.h -- Standard Fortran to C header file */ + +/** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed." + + - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */ + +#ifndef F2C_INCLUDE +#define F2C_INCLUDE + +typedef long int integer; +typedef unsigned long int uinteger; +typedef char *address; +typedef short int shortint; +typedef float real; +typedef double doublereal; +typedef struct { real r, i; } complex; +typedef struct { doublereal r, i; } doublecomplex; +typedef long int logical; +typedef short int shortlogical; +typedef char logical1; +typedef char integer1; +#ifdef INTEGER_STAR_8 /* Adjust for integer*8. */ +typedef long long longint; /* system-dependent */ +typedef unsigned long long ulongint; /* system-dependent */ +#define qbit_clear(a,b) ((a) & ~((ulongint)1 << (b))) +#define qbit_set(a,b) ((a) | ((ulongint)1 << (b))) +#endif + +#define TRUE_ (1) +#define FALSE_ (0) + +/* Extern is for use with -E */ +#ifndef Extern +#define Extern extern +#endif + +/* I/O stuff */ + +#ifdef f2c_i2 +/* for -i2 */ +typedef short flag; +typedef short ftnlen; +typedef short ftnint; +#else +typedef long int flag; +typedef long int ftnlen; +typedef long int ftnint; +#endif + +/*external read, write*/ +typedef struct +{ flag cierr; + ftnint ciunit; + flag ciend; + char *cifmt; + ftnint cirec; +} cilist; + +/*internal read, write*/ +typedef struct +{ flag icierr; + char *iciunit; + flag iciend; + char *icifmt; + ftnint icirlen; + ftnint icirnum; +} icilist; + +/*open*/ +typedef struct +{ flag oerr; + ftnint ounit; + char *ofnm; + ftnlen ofnmlen; + char *osta; + char *oacc; + char *ofm; + ftnint orl; + char *oblnk; +} olist; + +/*close*/ +typedef struct +{ flag cerr; + ftnint cunit; + char *csta; +} cllist; + +/*rewind, backspace, endfile*/ +typedef struct +{ flag aerr; + ftnint aunit; +} alist; + +/* inquire */ +typedef struct +{ flag inerr; + ftnint inunit; + char *infile; + ftnlen infilen; + ftnint *inex; /*parameters in standard's order*/ + ftnint *inopen; + ftnint *innum; + ftnint *innamed; + char *inname; + ftnlen innamlen; + char *inacc; + ftnlen inacclen; + char *inseq; + ftnlen inseqlen; + char *indir; + ftnlen indirlen; + char *infmt; + ftnlen infmtlen; + char *inform; + ftnint informlen; + char *inunf; + ftnlen inunflen; + ftnint *inrecl; + ftnint *innrec; + char *inblank; + ftnlen inblanklen; +} inlist; + +#define VOID void + +union Multitype { /* for multiple entry points */ + integer1 g; + shortint h; + integer i; + /* longint j; */ + real r; + doublereal d; + complex c; + doublecomplex z; + }; + +typedef union Multitype Multitype; + +/*typedef long int Long;*/ /* No longer used; formerly in Namelist */ + +struct Vardesc { /* for Namelist */ + char *name; + char *addr; + ftnlen *dims; + int type; + }; +typedef struct Vardesc Vardesc; + +struct Namelist { + char *name; + Vardesc **vars; + int nvars; + }; +typedef struct Namelist Namelist; + +#define abs(x) ((x) >= 0 ? (x) : -(x)) +#define dabs(x) (doublereal)abs(x) +#define min(a,b) ((a) <= (b) ? (a) : (b)) +#define max(a,b) ((a) >= (b) ? (a) : (b)) +#define dmin(a,b) (doublereal)min(a,b) +#define dmax(a,b) (doublereal)max(a,b) +#define bit_test(a,b) ((a) >> (b) & 1) +#define bit_clear(a,b) ((a) & ~((uinteger)1 << (b))) +#define bit_set(a,b) ((a) | ((uinteger)1 << (b))) + +/* procedure parameter types for -A and -C++ */ + +#define F2C_proc_par_types 1 +#ifdef __cplusplus +typedef int /* Unknown procedure type */ (*U_fp)(...); +typedef shortint (*J_fp)(...); +typedef integer (*I_fp)(...); +typedef real (*R_fp)(...); +typedef doublereal (*D_fp)(...), (*E_fp)(...); +typedef /* Complex */ VOID (*C_fp)(...); +typedef /* Double Complex */ VOID (*Z_fp)(...); +typedef logical (*L_fp)(...); +typedef shortlogical (*K_fp)(...); +typedef /* Character */ VOID (*H_fp)(...); +typedef /* Subroutine */ int (*S_fp)(...); +#else +typedef int /* Unknown procedure type */ (*U_fp)(); +typedef shortint (*J_fp)(); +typedef integer (*I_fp)(); +typedef real (*R_fp)(); +typedef doublereal (*D_fp)(), (*E_fp)(); +typedef /* Complex */ VOID (*C_fp)(); +typedef /* Double Complex */ VOID (*Z_fp)(); +typedef logical (*L_fp)(); +typedef shortlogical (*K_fp)(); +typedef /* Character */ VOID (*H_fp)(); +typedef /* Subroutine */ int (*S_fp)(); +#endif +/* E_fp is for real functions when -R is not specified */ +typedef VOID C_f; /* complex function */ +typedef VOID H_f; /* character function */ +typedef VOID Z_f; /* double complex function */ +typedef doublereal E_f; /* real function with -R not specified */ + +/* undef any lower-case symbols that your C compiler predefines, e.g.: */ + +#ifndef Skip_f2c_Undefs +#undef cray +#undef gcos +#undef mc68010 +#undef mc68020 +#undef mips +#undef pdp11 +#undef sgi +#undef sparc +#undef sun +#undef sun2 +#undef sun3 +#undef sun4 +#undef u370 +#undef u3b +#undef u3b2 +#undef u3b5 +#undef unix +#undef vax +#endif +#endif diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/levmar.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/levmar.h new file mode 100644 index 0000000..96b5e81 --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/levmar.h @@ -0,0 +1,370 @@ +/* +//////////////////////////////////////////////////////////////////////////////////// +// +// Prototypes and definitions for the Levenberg - Marquardt minimization algorithm +// Copyright (C) 2004 Manolis Lourakis (lourakis at ics forth gr) +// Institute of Computer Science, Foundation for Research & Technology - Hellas +// Heraklion, Crete, Greece. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +//////////////////////////////////////////////////////////////////////////////////// +*/ + +#ifndef _LEVMAR_H_ +#define _LEVMAR_H_ + + +/************************************* Start of configuration options *************************************/ + +/* specify whether to use LAPACK or not. The first option is strongly recommended */ +#define HAVE_LAPACK /* use LAPACK */ +/* #undef HAVE_LAPACK */ /* uncomment this to force not using LAPACK */ + +/* to avoid the overhead of repeated mallocs(), routines in Axb.c can be instructed to + * retain working memory between calls. Such a choice, however, renders these routines + * non-reentrant and is not safe in a shared memory multiprocessing environment. + * Bellow, this option is turned on only when not compiling with OpenMP. + */ +#if !defined(_OPENMP) +#define LINSOLVERS_RETAIN_MEMORY /* comment this if you don't want routines in Axb.c retain working memory between calls */ +#endif + +/* determine the precision variants to be build. Default settings build + * both the single and double precision routines + */ +#define LM_DBL_PREC /* comment this if you don't want the double precision routines to be compiled */ +#define LM_SNGL_PREC /* comment this if you don't want the single precision routines to be compiled */ + +/****************** End of configuration options, no changes necessary beyond this point ******************/ + + +#ifdef __cplusplus +extern "C" { +#endif + + +#define FABS(x) (((x)>=0.0)? (x) : -(x)) + +/* work arrays size for ?levmar_der and ?levmar_dif functions. + * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes + */ +#define LM_DER_WORKSZ(npar, nmeas) (2*(nmeas) + 4*(npar) + (nmeas)*(npar) + (npar)*(npar)) +#define LM_DIF_WORKSZ(npar, nmeas) (4*(nmeas) + 4*(npar) + (nmeas)*(npar) + (npar)*(npar)) + +/* work arrays size for ?levmar_bc_der and ?levmar_bc_dif functions. + * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes + */ +#define LM_BC_DER_WORKSZ(npar, nmeas) (2*(nmeas) + 4*(npar) + (nmeas)*(npar) + (npar)*(npar)) +#define LM_BC_DIF_WORKSZ(npar, nmeas) LM_BC_DER_WORKSZ((npar), (nmeas)) /* LEVMAR_BC_DIF currently implemented using LEVMAR_BC_DER()! */ + +/* work arrays size for ?levmar_lec_der and ?levmar_lec_dif functions. + * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes + */ +#define LM_LEC_DER_WORKSZ(npar, nmeas, nconstr) LM_DER_WORKSZ((npar)-(nconstr), (nmeas)) +#define LM_LEC_DIF_WORKSZ(npar, nmeas, nconstr) LM_DIF_WORKSZ((npar)-(nconstr), (nmeas)) + +/* work arrays size for ?levmar_blec_der and ?levmar_blec_dif functions. + * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes + */ +#define LM_BLEC_DER_WORKSZ(npar, nmeas, nconstr) LM_LEC_DER_WORKSZ((npar), (nmeas)+(npar), (nconstr)) +#define LM_BLEC_DIF_WORKSZ(npar, nmeas, nconstr) LM_LEC_DIF_WORKSZ((npar), (nmeas)+(npar), (nconstr)) + +/* work arrays size for ?levmar_bleic_der and ?levmar_bleic_dif functions. + * should be multiplied by sizeof(double) or sizeof(float) to be converted to bytes + */ +#define LM_BLEIC_DER_WORKSZ(npar, nmeas, nconstr1, nconstr2) LM_BLEC_DER_WORKSZ((npar)+(nconstr2), (nmeas)+(nconstr2), (nconstr1)+(nconstr2)) +#define LM_BLEIC_DIF_WORKSZ(npar, nmeas, nconstr1, nconstr2) LM_BLEC_DIF_WORKSZ((npar)+(nconstr2), (nmeas)+(nconstr2), (nconstr1)+(nconstr2)) + +#define LM_OPTS_SZ 5 /* max(4, 5) */ +#define LM_INFO_SZ 10 +#define LM_ERROR -1 +#define LM_INIT_MU 1E-03 +#define LM_STOP_THRESH 1E-17 +#define LM_DIFF_DELTA 1E-06 +#define LM_VERSION "2.5 (December 2009)" + +#ifdef LM_DBL_PREC +/* double precision LM, with & without Jacobian */ +/* unconstrained minimization */ +extern int dlevmar_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, int itmax, double *opts, + double *info, double *work, double *covar, void *adata); + +extern int dlevmar_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, int itmax, double *opts, + double *info, double *work, double *covar, void *adata); + +/* box-constrained minimization */ +extern int dlevmar_bc_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +extern int dlevmar_bc_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +#ifdef HAVE_LAPACK +/* linear equation constrained minimization */ +extern int dlevmar_lec_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *A, double *b, int k, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +extern int dlevmar_lec_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *A, double *b, int k, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +/* box & linear equation constrained minimization */ +extern int dlevmar_blec_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +extern int dlevmar_blec_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, double *A, double *b, int k, double *wghts, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +/* box, linear equations & inequalities constrained minimization */ +extern int dlevmar_bleic_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, + double *A, double *b, int k1, double *C, double *d, int k2, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +extern int dlevmar_bleic_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, + double *A, double *b, int k1, double *C, double *d, int k2, + int itmax, double *opts, double *info, double *work, double *covar, void *adata); + +/* box & linear inequality constraints */ +extern int dlevmar_blic_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2, + int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata); + +extern int dlevmar_blic_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *lb, double *ub, double *C, double *d, int k2, + int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata); + +/* linear equation & inequality constraints */ +extern int dlevmar_leic_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2, + int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata); + +extern int dlevmar_leic_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *A, double *b, int k1, double *C, double *d, int k2, + int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata); + +/* linear inequality constraints */ +extern int dlevmar_lic_der( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, double *x, int m, int n, double *C, double *d, int k2, + int itmax, double opts[4], double info[LM_INFO_SZ], double *work, double *covar, void *adata); + +extern int dlevmar_lic_dif( + void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *x, int m, int n, double *C, double *d, int k2, + int itmax, double opts[5], double info[LM_INFO_SZ], double *work, double *covar, void *adata); +#endif /* HAVE_LAPACK */ + +#endif /* LM_DBL_PREC */ + + +#ifdef LM_SNGL_PREC +/* single precision LM, with & without Jacobian */ +/* unconstrained minimization */ +extern int slevmar_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, int itmax, float *opts, + float *info, float *work, float *covar, void *adata); + +extern int slevmar_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, int itmax, float *opts, + float *info, float *work, float *covar, void *adata); + +/* box-constrained minimization */ +extern int slevmar_bc_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +extern int slevmar_bc_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +#ifdef HAVE_LAPACK +/* linear equation constrained minimization */ +extern int slevmar_lec_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *A, float *b, int k, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +extern int slevmar_lec_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *A, float *b, int k, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +/* box & linear equation constrained minimization */ +extern int slevmar_blec_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, float *A, float *b, int k, float *wghts, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +extern int slevmar_blec_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, float *A, float *b, int k, float *wghts, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +/* box, linear equations & inequalities constrained minimization */ +extern int slevmar_bleic_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, + float *A, float *b, int k1, float *C, float *d, int k2, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +extern int slevmar_bleic_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, + float *A, float *b, int k1, float *C, float *d, int k2, + int itmax, float *opts, float *info, float *work, float *covar, void *adata); + +/* box & linear inequality constraints */ +extern int slevmar_blic_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, float *C, float *d, int k2, + int itmax, float opts[4], float info[LM_INFO_SZ], float *work, float *covar, void *adata); + +extern int slevmar_blic_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *lb, float *ub, float *C, float *d, int k2, + int itmax, float opts[5], float info[LM_INFO_SZ], float *work, float *covar, void *adata); + +/* linear equality & inequality constraints */ +extern int slevmar_leic_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *A, float *b, int k1, float *C, float *d, int k2, + int itmax, float opts[4], float info[LM_INFO_SZ], float *work, float *covar, void *adata); + +extern int slevmar_leic_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *A, float *b, int k1, float *C, float *d, int k2, + int itmax, float opts[5], float info[LM_INFO_SZ], float *work, float *covar, void *adata); + +/* linear inequality constraints */ +extern int slevmar_lic_der( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, float *x, int m, int n, float *C, float *d, int k2, + int itmax, float opts[4], float info[LM_INFO_SZ], float *work, float *covar, void *adata); + +extern int slevmar_lic_dif( + void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *x, int m, int n, float *C, float *d, int k2, + int itmax, float opts[5], float info[LM_INFO_SZ], float *work, float *covar, void *adata); +#endif /* HAVE_LAPACK */ + +#endif /* LM_SNGL_PREC */ + +/* linear system solvers */ +#ifdef HAVE_LAPACK + +#ifdef LM_DBL_PREC +extern int dAx_eq_b_QR(double *A, double *B, double *x, int m); +extern int dAx_eq_b_QRLS(double *A, double *B, double *x, int m, int n); +extern int dAx_eq_b_Chol(double *A, double *B, double *x, int m); +extern int dAx_eq_b_LU(double *A, double *B, double *x, int m); +extern int dAx_eq_b_SVD(double *A, double *B, double *x, int m); +extern int dAx_eq_b_BK(double *A, double *B, double *x, int m); +#endif /* LM_DBL_PREC */ + +#ifdef LM_SNGL_PREC +extern int sAx_eq_b_QR(float *A, float *B, float *x, int m); +extern int sAx_eq_b_QRLS(float *A, float *B, float *x, int m, int n); +extern int sAx_eq_b_Chol(float *A, float *B, float *x, int m); +extern int sAx_eq_b_LU(float *A, float *B, float *x, int m); +extern int sAx_eq_b_SVD(float *A, float *B, float *x, int m); +extern int sAx_eq_b_BK(float *A, float *B, float *x, int m); +#endif /* LM_SNGL_PREC */ + +#else /* no LAPACK */ + +#ifdef LM_DBL_PREC +extern int dAx_eq_b_LU_noLapack(double *A, double *B, double *x, int n); +#endif /* LM_DBL_PREC */ + +#ifdef LM_SNGL_PREC +extern int sAx_eq_b_LU_noLapack(float *A, float *B, float *x, int n); +#endif /* LM_SNGL_PREC */ + +#endif /* HAVE_LAPACK */ + +/* Jacobian verification, double & single precision */ +#ifdef LM_DBL_PREC +extern void dlevmar_chkjac( + void (*func)(double *p, double *hx, int m, int n, void *adata), + void (*jacf)(double *p, double *j, int m, int n, void *adata), + double *p, int m, int n, void *adata, double *err); +#endif /* LM_DBL_PREC */ + +#ifdef LM_SNGL_PREC +extern void slevmar_chkjac( + void (*func)(float *p, float *hx, int m, int n, void *adata), + void (*jacf)(float *p, float *j, int m, int n, void *adata), + float *p, int m, int n, void *adata, float *err); +#endif /* LM_SNGL_PREC */ + +/* standard deviation, coefficient of determination (R2) & Pearson's correlation coefficient for best-fit parameters */ +#ifdef LM_DBL_PREC +extern double dlevmar_stddev( double *covar, int m, int i); +extern double dlevmar_corcoef(double *covar, int m, int i, int j); +extern double dlevmar_R2(void (*func)(double *p, double *hx, int m, int n, void *adata), double *p, double *x, int m, int n, void *adata); + +#endif /* LM_DBL_PREC */ + +#ifdef LM_SNGL_PREC +extern float slevmar_stddev( float *covar, int m, int i); +extern float slevmar_corcoef(float *covar, int m, int i, int j); +extern float slevmar_R2(void (*func)(float *p, float *hx, int m, int n, void *adata), float *p, float *x, int m, int n, void *adata); +#endif /* LM_SNGL_PREC */ + +#ifdef __cplusplus +} +#endif + +#endif /* _LEVMAR_H_ */ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/lm.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/lm.h new file mode 100644 index 0000000..980d00c --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/lm.h @@ -0,0 +1 @@ +levmar.h \ No newline at end of file diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/include/misc.h b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/misc.h new file mode 100644 index 0000000..e32f18d --- /dev/null +++ b/ref/AutoStitching/source/GeneralLibs/LM2.5/include/misc.h @@ -0,0 +1,106 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Levenberg - Marquardt non-linear minimization algorithm +// Copyright (C) 2004 Manolis Lourakis (lourakis at ics forth gr) +// Institute of Computer Science, Foundation for Research & Technology - Hellas +// Heraklion, Crete, Greece. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#ifndef _MISC_H_ +#define _MISC_H_ + +/* common suffix for LAPACK subroutines. Define empty in case of no prefix. */ +#define LM_LAPACK_SUFFIX _ +//#define LM_LAPACK_SUFFIX // define empty + +/* common prefix for BLAS subroutines. Leave undefined in case of no prefix. + * You might also need to modify LM_BLAS_PREFIX below + */ +/* f2c'd BLAS */ +//#define LM_BLAS_PREFIX f2c_ +/* C BLAS */ +//#define LM_BLAS_PREFIX cblas_ + +/* common suffix for BLAS subroutines */ +//#define LM_BLAS_SUFFIX // define empty if a f2c_ or cblas_ prefix was defined for LM_BLAS_PREFIX above +#define LM_BLAS_SUFFIX _ // use this in case of no BLAS prefix + + +#define LCAT_(a, b) #a b +#define LCAT(a, b) LCAT_(a, b) // force substitution +#define RCAT_(a, b) a #b +#define RCAT(a, b) RCAT_(a, b) // force substitution + +#define LM_MK_LAPACK_NAME(s) LM_ADD_PREFIX(LM_CAT_(s, LM_LAPACK_SUFFIX)) + + +#define __BLOCKSZ__ 32 /* block size for cache-friendly matrix-matrix multiply. It should be + * such that __BLOCKSZ__^2*sizeof(LM_REAL) is smaller than the CPU (L1) + * data cache size. Notice that a value of 32 when LM_REAL=double assumes + * an 8Kb L1 data cache (32*32*8=8K). This is a concervative choice since + * newer Pentium 4s have a L1 data cache of size 16K, capable of holding + * up to 45x45 double blocks. + */ +#define __BLOCKSZ__SQ (__BLOCKSZ__)*(__BLOCKSZ__) + +/* add a prefix in front of a token */ +#define LM_CAT__(a, b) a ## b +#define LM_CAT_(a, b) LM_CAT__(a, b) // force substitution +#define LM_ADD_PREFIX(s) LM_CAT_(LM_PREFIX, s) + +#ifdef __cplusplus +extern "C" { +#endif + +/* blocking-based matrix multiply */ +extern void slevmar_trans_mat_mat_mult(float *a, float *b, int n, int m); +extern void dlevmar_trans_mat_mat_mult(double *a, double *b, int n, int m); + +/* forward finite differences */ +extern void slevmar_fdif_forw_jac_approx(void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *hx, float *hxx, float delta, + float *jac, int m, int n, void *adata); +extern void dlevmar_fdif_forw_jac_approx(void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *hx, double *hxx, double delta, + double *jac, int m, int n, void *adata); + +/* central finite differences */ +extern void slevmar_fdif_cent_jac_approx(void (*func)(float *p, float *hx, int m, int n, void *adata), + float *p, float *hxm, float *hxp, float delta, + float *jac, int m, int n, void *adata); +extern void dlevmar_fdif_cent_jac_approx(void (*func)(double *p, double *hx, int m, int n, void *adata), + double *p, double *hxm, double *hxp, double delta, + double *jac, int m, int n, void *adata); + +/* e=x-y and ||e|| */ +extern float slevmar_L2nrmxmy(float *e, float *x, float *y, int n); +extern double dlevmar_L2nrmxmy(double *e, double *x, double *y, int n); + +/* covariance of LS fit */ +extern int slevmar_covar(float *JtJ, float *C, float sumsq, int m, int n); +extern int dlevmar_covar(double *JtJ, double *C, double sumsq, int m, int n); + +/* box constraints consistency check */ +extern int slevmar_box_check(float *lb, float *ub, int m); +extern int dlevmar_box_check(double *lb, double *ub, int m); + +/* Cholesky */ +extern int slevmar_chol(float *C, float *W, int m); +extern int dlevmar_chol(double *C, double *W, int m); + +#ifdef __cplusplus +} +#endif + +#endif /* _MISC_H_ */ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLAS.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLAS.lib new file mode 100644 index 0000000..bed2534 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLAS.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLAS_nowrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLAS_nowrap.lib new file mode 100644 index 0000000..5e0b31a Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLAS_nowrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLASd.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLASd.lib new file mode 100644 index 0000000..6b54554 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLASd.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLASd_nowrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLASd_nowrap.lib new file mode 100644 index 0000000..0bd7d8e Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/BLASd_nowrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/cblaswrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/cblaswrap.lib new file mode 100644 index 0000000..729f0d5 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/cblaswrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/cblaswrapd.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/cblaswrapd.lib new file mode 100644 index 0000000..455de2c Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/cblaswrapd.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapack.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapack.lib new file mode 100644 index 0000000..b9502c9 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapack.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapack_nowrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapack_nowrap.lib new file mode 100644 index 0000000..16f60db Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapack_nowrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapackd.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapackd.lib new file mode 100644 index 0000000..c0feeea Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapackd.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapackd_nowrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapackd_nowrap.lib new file mode 100644 index 0000000..4a74987 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/clapackd_nowrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/f77blaswrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/f77blaswrap.lib new file mode 100644 index 0000000..3a883cf Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/f77blaswrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/f77blaswrapd.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/f77blaswrapd.lib new file mode 100644 index 0000000..a16afbf Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/f77blaswrapd.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/levmar.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/levmar.lib new file mode 100644 index 0000000..a8e3a2a Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/levmar.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/libf2c.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/libf2c.lib new file mode 100644 index 0000000..a0aa71d Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/libf2c.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/libf2cd.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/libf2cd.lib new file mode 100644 index 0000000..94335a4 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/libf2cd.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglib.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglib.lib new file mode 100644 index 0000000..3adf33c Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglib.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglib_nowrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglib_nowrap.lib new file mode 100644 index 0000000..3ad623d Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglib_nowrap.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglibd.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglibd.lib new file mode 100644 index 0000000..b5c01db Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglibd.lib differ diff --git a/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglibd_nowrap.lib b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglibd_nowrap.lib new file mode 100644 index 0000000..0445955 Binary files /dev/null and b/ref/AutoStitching/source/GeneralLibs/LM2.5/x64libs/tmglibd_nowrap.lib differ diff --git a/ref/AutoStitching/source/Src/CMakeLists.txt b/ref/AutoStitching/source/Src/CMakeLists.txt new file mode 100644 index 0000000..9b034aa --- /dev/null +++ b/ref/AutoStitching/source/Src/CMakeLists.txt @@ -0,0 +1,2 @@ +ADD_SUBDIRECTORY(Mosaic) +ADD_SUBDIRECTORY(Utils) \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Mosaic/CMakeLists.txt b/ref/AutoStitching/source/Src/Mosaic/CMakeLists.txt new file mode 100644 index 0000000..e56ff0c --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/CMakeLists.txt @@ -0,0 +1,29 @@ +PROJECT( Mosaic ) +STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_CAPITALIZED) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3) +ADD_DEFINITIONS(-DUNICODE) + +#Use MFC in a Shared DLL +ADD_DEFINITIONS(-D_AFXDLL) +SET(CMAKE_MFC_FLAG 2) + +FILE(GLOB_RECURSE HDRS_FILES *.h *.hpp) +FILE(GLOB_RECURSE SRCS_FILES *.cpp) +FILE(GLOB_RECURSE UI_FILES *.ui) +FILE(GLOB CD_FILES *.cd) + +SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRCS_FILES} ${UI_FILES} ${HDRS_FILES} PARENT_SCOPE) + +SOURCE_GROUP("UI Files" FILES ${UI_FILES}) +SOURCE_GROUP("Generated Files" FILES ${MOC_SRCS} ${UI_HDRS} ${RSC_SRCS}) +SOURCE_GROUP("Class Diagrams" FILES ${CD_FILES} ) +#SOURCE_GROUP("Resources" FILES ${RSCS} ) + +ADD_EXECUTABLE(${PROJECT_NAME} ${HDRS_FILES} ${SRCS_FILES} ${UI_HDRS} ${UI_FILES} ${RSC_SRCS} ${MOC_SRCS} ${CD_FILES}) +ADD_DEPENDENCIES(${PROJECT_NAME} Utils) +SET_SOURCE_FILES_PROPERTIES(${CD_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) # DO NOT COMPILE CS FILES +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${QT_LIBRARIES} ${OpenCV_LIBS} Utils libf2cd.lib BLASd.lib clapackd.lib tmglibd.lib levmar.lib) +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:libcmt.lib") + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER SRC) +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/ref/AutoStitching/source/Src/Mosaic/alignment.cpp b/ref/AutoStitching/source/Src/Mosaic/alignment.cpp new file mode 100644 index 0000000..f44ecea --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/alignment.cpp @@ -0,0 +1,2127 @@ +#include "alignment.h" +#include + +//-------------------------------------------------alignment order +void ImageAligner::sortImageOrder(int referNo, bool shallLoad, bool isInorder) +{ + cout<<"#Finding topology ..."< costGraph = Utils::buildCostGraph(_similarityMat); + cout<<"-Completed"<_imgSizeList; + + //! =============== Topology sorting =============== + bool shallLoad = loadTopology, isInOrder = isSeqData; //! ### set this for new data + sortImageOrder(referNo, shallLoad, isInOrder); + + //! =============== build match net =============== + fillImageMatchNet(); + +// loadHomographies(); + cout<<"#Sequential image alignment start ..."< identMatrix = Mat::eye(3,3,CV_64FC1); //cvtMatrix of reference image + _alignModelList.push_back(identMatrix); + _initModelList.push_back(identMatrix); + Quadra bar; + bar.imgSize = _imgSizeList[_visitOrder[0].imgNo]; + bar.centroid = Point2d(bar.imgSize.width/2, bar.imgSize.height/2); + _projCoordSet.push_back(bar); + for (int i = 1; i < _groupCusorList.size(); i ++) + { + int sIndex = _groupCusorList[i-1]+1; + int eIndex = _groupCusorList[i]; + cout<<"Aligning Group "<_imgSizeList; + //! =============== Topology sorting =============== + bool shallLoad = loadTopology, isInOrder = isSeqData; //! ### set this for new data + sortImageOrder(referNo, shallLoad, isInOrder); + // return false; + //! =============== build match net =============== + fillImageMatchNet(); + + cout<<"#Sequential image alignment start ..."< identMatrix = Mat::eye(3,3,CV_64FC1); //cvtMatrix of reference image + _alignModelList.push_back(identMatrix); + _initModelList.push_back(identMatrix); + bool needRefine = true; + for (int i = 1; i < _imgNum; i ++) + { + cout<<"Aligning Image "<<_visitOrder[i].imgNo<<" "; + solveSingleModel(i); + if (needRefine && 0) + { + for (int j = 0; j < _groupCusorList.size(); j ++) + { + if (i == _groupCusorList[j]) + { + int sIndex = _groupCusorList[j-1]+1; + int eIndex = _groupCusorList[j]; + bundleAdjustingA(sIndex, eIndex); + break; + } + } + } + cout<<"Done!"< PtSet1, PtSet2; + if (!Utils::loadMatchPts(i,j,PtSet1,PtSet2)) + { + continue; + } + sum += PtSet1.size(); + int indexj = findVisitIndex(j); + _matchNetList[i].relatedImgs.push_back(indexj); + _matchNetList[i].PointSet.push_back(PtSet1); + int indexi = findVisitIndex(i); + _matchNetList[j].relatedImgs.push_back(indexi); + _matchNetList[j].PointSet.push_back(PtSet2); + } + } + cout<<"-Completed! - with "< > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + if (relatedNos[j] < i) //! avoid repeating counting + { + measureNum += pointSet[j].size(); + } + } + } + int paramNum = 6*(eIndex-sIndex+1); + Mat_ A = Mat(2*measureNum, paramNum, CV_64FC1, Scalar(0)); + Mat_ L = Mat(2*measureNum, 1, CV_64FC1, Scalar(0)); + int rn = 0; + for (int i = sIndex; i <= eIndex; i ++) + { + int imgNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + int neigIndex = relatedNos[j]; + if (neigIndex > i) + { + continue; + } + int neigImgNo = _visitOrder[neigIndex].imgNo; + vector neigRelatedNos = _matchNetList[neigImgNo].relatedImgs; + + vector curPts, neigPts; + curPts = pointSet[j]; + //! case 1 : aligning with aligned image + if (neigIndex < sIndex) + { + for (int t = 0; t < neigRelatedNos.size(); t ++) + { + if (neigRelatedNos[t] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[t]; + Utils::pointTransform(_alignModelList[neigIndex], neigPts); + break; + } + } + int fillPos = 6*(i-sIndex); + for (int k = 0; k < curPts.size(); k ++) + { + A(2*rn,fillPos) = curPts[k].x; A(2*rn,fillPos+1) = curPts[k].y; A(2*rn,fillPos+2) = 1; + A(2*rn+1,fillPos+3) = curPts[k].x; A(2*rn+1,fillPos+4) = curPts[k].y; A(2*rn+1,fillPos+5) = 1; + L(2*rn) = neigPts[k].x; + L(2*rn+1) = neigPts[k].y; + rn ++; + } + } + //! case 2 : aligning with unaligned image + else if (neigIndex >= sIndex) + { + for (int t = 0; t < neigRelatedNos.size(); t ++) + { + if (neigRelatedNos[t] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[t]; + break; + } + } + int fillPos1 = 6*(i-sIndex), fillPos2 = 6*(neigIndex-sIndex); + for (int k = 0; k < curPts.size(); k ++) + { + A(2*rn,fillPos1) = curPts[k].x; A(2*rn,fillPos1+1) = curPts[k].y; A(2*rn,fillPos1+2) = 1; + A(2*rn+1,fillPos1+3) = curPts[k].x; A(2*rn+1,fillPos1+4) = curPts[k].y; A(2*rn+1,fillPos1+5) = 1; + A(2*rn,fillPos2) = -neigPts[k].x; A(2*rn,fillPos2+1) = -neigPts[k].y; A(2*rn,fillPos2+2) = -1; + A(2*rn+1,fillPos2+3) = -neigPts[k].x; A(2*rn+1,fillPos2+4) = -neigPts[k].y; A(2*rn+1,fillPos2+5) = -1; + L(2*rn) = 0; + L(2*rn+1) = 0; + rn ++; + } + } + } + } + Mat_ X = (A.t()*A).inv()*(A.t()*L); + for (int i = 0; i < paramNum; i += 6) + { + Mat_ affineModel = (Mat_(3,3) << X(i) , X(i+1), X(i+2), + X(i+3), X(i+4), X(i+5), + 0, 0, 1); + _alignModelList.push_back(affineModel); + _initModelList.push_back(affineModel); + } +} + + +void ImageAligner::solveGroupModelsS(int sIndex, int eIndex) +{ + int measureNum = 0; + for (int i = sIndex; i <= eIndex; i ++) + { + int imgNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + if (relatedNos[j] < i) //! avoid repeating counting + { + measureNum += pointSet[j].size(); + } + } + } + int paramNum = 4*(eIndex-sIndex+1); + Mat_ A = Mat(2*measureNum, paramNum, CV_64FC1, Scalar(0)); + Mat_ L = Mat(2*measureNum, 1, CV_64FC1, Scalar(0)); + int rn = 0; + for (int i = sIndex; i <= eIndex; i ++) + { + int imgNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + int neigIndex = relatedNos[j]; + if (neigIndex > i) + { + continue; + } + int neigImgNo = _visitOrder[neigIndex].imgNo; + vector neigRelatedNos = _matchNetList[neigImgNo].relatedImgs; + + vector curPts, neigPts; + curPts = pointSet[j]; + //! case 1 : aligning with aligned image + if (neigIndex < sIndex) + { + for (int t = 0; t < neigRelatedNos.size(); t ++) + { + if (neigRelatedNos[t] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[t]; + Utils::pointTransform(_alignModelList[neigIndex], neigPts); + break; + } + } + int fillPos = 4*(i-sIndex); + for (int k = 0; k < curPts.size(); k ++) + { + A(2*rn,fillPos) = curPts[k].x; A(2*rn,fillPos+1) = -curPts[k].y; A(2*rn,fillPos+2) = 1; + A(2*rn+1,fillPos) = curPts[k].y; A(2*rn+1,fillPos+1) = curPts[k].x; A(2*rn+1,fillPos+3) = 1; + L(2*rn) = neigPts[k].x; + L(2*rn+1) = neigPts[k].y; + rn ++; + } + } + //! case 2 : aligning with unaligned image + else if (neigIndex >= sIndex) + { + for (int t = 0; t < neigRelatedNos.size(); t ++) + { + if (neigRelatedNos[t] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[t]; + break; + } + } + int fillPos1 = 4*(i-sIndex), fillPos2 = 4*(neigIndex-sIndex); + for (int k = 0; k < curPts.size(); k ++) + { + A(2*rn,fillPos1) = curPts[k].x; A(2*rn,fillPos1+1) = -curPts[k].y; A(2*rn,fillPos1+2) = 1; + A(2*rn+1,fillPos1) = curPts[k].y; A(2*rn+1,fillPos1+1) = curPts[k].x; A(2*rn+1,fillPos1+3) = 1; + A(2*rn,fillPos2) = -neigPts[k].x; A(2*rn,fillPos2+1) = neigPts[k].y; A(2*rn,fillPos2+2) = -1; + A(2*rn+1,fillPos2) = -neigPts[k].y; A(2*rn+1,fillPos2+1) = -neigPts[k].x; A(2*rn+1,fillPos2+3) = -1; + L(2*rn) = 0; + L(2*rn+1) = 0; + rn ++; + } + } + } + } + Mat_ X = (A.t()*A).inv()*(A.t()*L); + for (int i = 0; i < paramNum; i += 4) + { + Mat_ affineModel = (Mat_(3,3) << X(i) , -X(i+1), X(i+2), + X(i+1), X(i), X(i+3), + 0, 0, 1); + // cout< relatedNos = _matchNetList[imgNo].relatedImgs; + vector > pointSet = _matchNetList[imgNo].PointSet; + for (int i = 0; i < relatedNos.size(); i ++) + { + if (relatedNos[i] < imgIndex) + { + measureNum += pointSet[i].size(); + } + } + int paramNum = 6; + Mat_ A = Mat(2*measureNum, paramNum, CV_64FC1, Scalar(0)); + Mat_ L = Mat(2*measureNum, 1, CV_64FC1, Scalar(0)); + int rn = 0; + vector PtSet1, PtSet2; + for (int i = 0; i < relatedNos.size(); i ++) + { + int neigIndex = relatedNos[i]; + if (neigIndex > imgIndex) + { + continue; + } + vector curPts, neigPts; + curPts = pointSet[i]; + int neigImgNo = _visitOrder[neigIndex].imgNo; + vector neigRelatedNos = _matchNetList[neigImgNo].relatedImgs; + for (int t = 0; t < neigRelatedNos.size(); t ++) + { + if (neigRelatedNos[t] == imgIndex) + { + neigPts = _matchNetList[neigImgNo].PointSet[t]; + Utils::pointTransform(_alignModelList[neigIndex], neigPts); + break; + } + } + for (int k = 0; k < curPts.size(); k ++) + { + A(2*rn,0) = curPts[k].x; A(2*rn,1) = curPts[k].y; A(2*rn,2) = 1; + A(2*rn+1,3) = curPts[k].x; A(2*rn+1,4) = curPts[k].y; A(2*rn+1,5) = 1; + L(2*rn) = neigPts[k].x; + L(2*rn+1) = neigPts[k].y; + rn ++; + } + //! for homogaphy + //for (int k = 0; k < curPts.size(); k ++) + //{ + // PtSet1.push_back(curPts[k]); + // PtSet2.push_back(neigPts[k]); + //} + } + Mat_ X = (A.t()*A).inv()*(A.t()*L); + Mat_ affineModel = (Mat_(3,3) << X(0), X(1), X(2), + X(3), X(4), X(5), + 0, 0, 1); + +// Mat_ homoMat = findHomography(PtSet1, PtSet2, CV_RANSAC, 1.5); + + _alignModelList.push_back(affineModel); + _initModelList.push_back(affineModel); +} + + +void ImageAligner::bundleAdjusting(int sIndex, int eIndex) +{ + cout<<"Bundle adjusting ...("< > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + if (relatedNos[j] < i) //! avoid repeating counting + { + int num = pointSet[j].size(); + num = num%3 == 0 ? (num/3) : (num/3+1); + measureNum += num; //! only 1/3 of matching pairs for optimization + } + } + } + int paramNum = 8*(eIndex-sIndex+1); //! optimizing homgraphic model with 8 DoF + double *X = new double[paramNum]; + double *initX = new double[6*(eIndex-sIndex+1)]; + buildIniSolution(X, initX, sIndex, eIndex); + //! parameters setting of least square optimization + double lambada = Lambada; + int max_iters = 10; + + int rn = 0, ite = 0; + while (1) + { + double meanBias = 0; + rn = 0; + Mat_ AtA = Mat(paramNum, paramNum, CV_64FC1, Scalar(0)); + Mat_ AtL = Mat(paramNum, 1, CV_64FC1, Scalar(0)); + for (int i = sIndex; i <= eIndex; i ++) + { + //! prepare relative data or parameters of current image + int imgNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + int neigIndex = relatedNos[j]; + if (neigIndex > i) + { + continue; + } + vector curPts, neigPts; + curPts = pointSet[j]; + int neigImgNo = _visitOrder[neigIndex].imgNo; + vector neigRelatedNos = _matchNetList[neigImgNo].relatedImgs; + for (int k = 0; k < neigRelatedNos.size(); k ++) + { + if (neigRelatedNos[k] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[k]; + break; + } + } + + int curse0 = i-sIndex, curse1 = neigIndex-sIndex; + int fillPos0 = curse0*8, fillPos1 = curse1*8; + int num = curPts.size(), n = 0; + Mat_ Ai = Mat(num, paramNum, CV_64FC1, Scalar(0)); + Mat_ Li = Mat(num, 1, CV_64FC1, Scalar(0)); + double *AiPtr = (double*)Ai.data; + double *LiPtr = (double*)Li.data; + //! case 1 : with a fixed image + if (neigIndex < sIndex) + { + Utils::pointTransform(_alignModelList[neigIndex], neigPts); + for (int t = 0; t < curPts.size(); t += 3) + { + int x0 = curPts[t].x, y0 = curPts[t].y, x1 = neigPts[t].x, y1 = neigPts[t].y; + double hX0 = X[fillPos0+0]*x0 + X[fillPos0+1]*y0 + X[fillPos0+2]; //! h1*x0 + h2*y0 + h3 + double hY0 = X[fillPos0+3]*x0 + X[fillPos0+4]*y0 + X[fillPos0+5]; //! h4*x0 + h5*y0 + h6 + double hW0 = X[fillPos0+6]*x0 + X[fillPos0+7]*y0 + 1; //! h7*x0 + h8*y0 + 1 + + double orgx0 = initX[6*curse0+0]*x0 + initX[6*curse0+1]*y0 + initX[6*curse0+2]; + double orgy0 = initX[6*curse0+3]*x0 + initX[6*curse0+4]*y0 + initX[6*curse0+5]; + + double K1 = 2*(hX0/hW0-x1) + 2*lambada*(hX0/hW0-orgx0); + double K2 = 2*(hY0/hW0-y1) + 2*lambada*(hY0/hW0-orgy0); + + //! for : x = ... + AiPtr[n*paramNum+fillPos0] = K1*x0/hW0; + AiPtr[n*paramNum+fillPos0+1] = K1*y0/hW0; + AiPtr[n*paramNum+fillPos0+2] = K1*1/hW0; + AiPtr[n*paramNum+fillPos0+3] = K2*x0/hW0; + AiPtr[n*paramNum+fillPos0+4] = K2*y0/hW0; + AiPtr[n*paramNum+fillPos0+5] = K2*1/hW0; + AiPtr[n*paramNum+fillPos0+6] = -(K1+K2)*x0*hX0/(hW0*hW0); + AiPtr[n*paramNum+fillPos0+7] = -(K1+K2)*y0*hX0/(hW0*hW0); + + double delta_d = (hX0/hW0-x1)*(hX0/hW0-x1) + (hY0/hW0-y1)*(hY0/hW0-y1); + double delta_r = lambada*((hX0/hW0-orgx0)*(hX0/hW0-orgx0) + (hY0/hW0-orgy0)*(hY0/hW0-orgy0)); + LiPtr[n] = -(delta_d+delta_r); + + double bias = sqrt(delta_d+delta_r); + meanBias += bias; + n ++; + rn ++; + } + //! get in normal equation matrix + Mat_ Ait = Ai.t(); + Mat_ barA = Ait*Ai, barL = Ait*Li; + AtA += barA; + AtL += barL; + continue; + } + + //! case 2 : with a remain optimized image + for (int t = 0; t < curPts.size(); t += 3) + { + int x0 = curPts[t].x, y0 = curPts[t].y, x1 = neigPts[t].x, y1 = neigPts[t].y; + double hX0 = X[fillPos0+0]*x0 + X[fillPos0+1]*y0 + X[fillPos0+2]; //! h1*x0 + h2*y0 + h3 + double hY0 = X[fillPos0+3]*x0 + X[fillPos0+4]*y0 + X[fillPos0+5]; //! h4*x0 + h5*y0 + h6 + double hW0 = X[fillPos0+6]*x0 + X[fillPos0+7]*y0 + 1; //! h7*x0 + h8*y0 + 1 + double hX1 = X[fillPos1+0]*x1 + X[fillPos1+1]*y1 + X[fillPos1+2]; //! h1'*x1 + h2'*y1 + h3' + double hY1 = X[fillPos1+3]*x1 + X[fillPos1+4]*y1 + X[fillPos1+5]; //! h4'*x1 + h5'*y1 + h6' + double hW1 = X[fillPos1+6]*x1 + X[fillPos1+7]*y1 + 1; //! h7'*x1 + h8'*y1 + 1 + + double orgx0 = initX[6*curse0+0]*x0 + initX[6*curse0+1]*y0 + initX[6*curse0+2]; + double orgy0 = initX[6*curse0+3]*x0 + initX[6*curse0+4]*y0 + initX[6*curse0+5]; + double orgx1 = initX[6*curse1+0]*x1 + initX[6*curse1+1]*y1 + initX[6*curse1+2]; + double orgy1 = initX[6*curse1+3]*x1 + initX[6*curse1+4]*y1 + initX[6*curse1+5]; + + double K1 = 2*(hX0/hW0-hX1/hW1) + 2*lambada*(hX0/hW0-orgx0); + double K2 = 2*(hY0/hW0-hY1/hW1) + 2*lambada*(hY0/hW0-orgy0); + double K3 = -2*(hX0/hW0-hX1/hW1) + 2*lambada*(hX1/hW1-orgx1); + double K4 = -2*(hY0/hW0-hY1/hW1) + 2*lambada*(hY1/hW1-orgy1); + + //! for : x = ... + //! cur-image + AiPtr[n*paramNum+fillPos0] = K1*x0/hW0; + AiPtr[n*paramNum+fillPos0+1] = K1*y0/hW0; + AiPtr[n*paramNum+fillPos0+2] = K1*1/hW0; + AiPtr[n*paramNum+fillPos0+3] = K2*x0/hW0; + AiPtr[n*paramNum+fillPos0+4] = K2*y0/hW0; + AiPtr[n*paramNum+fillPos0+5] = K2*1/hW0; + AiPtr[n*paramNum+fillPos0+6] = -(K1+K2)*x0*hX0/(hW0*hW0); + AiPtr[n*paramNum+fillPos0+7] = -(K1+K2)*y0*hX0/(hW0*hW0); + //! neig-image + AiPtr[n*paramNum+fillPos1] = K3*x1/hW1; + AiPtr[n*paramNum+fillPos1+1] = K3*y1/hW1; + AiPtr[n*paramNum+fillPos1+2] = K3*1/hW1; + AiPtr[n*paramNum+fillPos1+3] = K4*x1/hW1; + AiPtr[n*paramNum+fillPos1+4] = K4*y1/hW1; + AiPtr[n*paramNum+fillPos1+5] = K4*1/hW1; + AiPtr[n*paramNum+fillPos1+6] = -(K3+K4)*x1*hX1/(hW1*hW1); + AiPtr[n*paramNum+fillPos1+7] = -(K3+K4)*y1*hX1/(hW1*hW1); + + double delta_d = (hX0/hW0-hX1/hW1)*(hX0/hW0-hX1/hW1) + (hY0/hW0-hY1/hW1)*(hY0/hW0-hY1/hW1); + double delta_r = lambada*((hX0/hW0-orgx0)*(hX0/hW0-orgx0) + (hY0/hW0-orgy0)*(hY0/hW0-orgy0) + + (hX1/hW1-orgx1)*(hX1/hW1-orgx1) + (hY1/hW1-orgy1)*(hY1/hW1-orgy1)); + LiPtr[n] = -(delta_d+delta_r); + + double bias = sqrt(delta_d+delta_r); + meanBias += bias; + rn ++; + n ++; + } + //! get in normal equation matrix + Mat_ Ait = Ai.t(); + Mat_ barA = Ait*Ai, barL = Ait*Li; + AtA += barA; + AtL += barL; + } + } + meanBias = meanBias/rn; + cout<<"Iteration: "< dX = AtA.inv()*AtL; + double *dXPtr = (double*)dX.data; + double delta = 0; //! record the translation parameters of images + int num = 0; + for (int i = 0; i < paramNum; i ++) + { + X[i] += dXPtr[i]; + if ((i+1)%8 == 3 || (i+1)%8 == 6) + { +// cout< > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + if (relatedNos[j] < i) //! avoid repeating counting + { + int num = pointSet[j].size(); + num = num%3 == 0 ? (num/3) : (num/3+1); + measureNum += num; //! only 1/3 of matching pairs for optimization + } + } + } + int paramNum = 8*(eIndex-sIndex+1); //! optimizing homgraphic model with 8 DoF + Mat_ A = Mat(2*measureNum, paramNum, CV_64FC1, Scalar(0)); + Mat_ L = Mat(2*measureNum, 1, CV_64FC1, Scalar(0)); + double *APtr = (double*)A.data; + double *LPtr = (double*)L.data; + + double *X = new double[paramNum]; + double *initX = new double[6*(eIndex-sIndex+1)]; + buildIniSolution(X, initX, sIndex, eIndex); + //! parameters setting of least square optimization + double lambada = Lambada; + int max_iters = 10; + + int rn = 0, ite = 0; + while (1) + { + double meanBias = 0; + rn = 0; + for (int i = sIndex; i <= eIndex; i ++) + { + //! prepare relative data or parameters of current image + int imgNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + int neigIndex = relatedNos[j]; + if (neigIndex > i) + { + continue; + } + vector curPts, neigPts; + curPts = pointSet[j]; + int neigImgNo = _visitOrder[neigIndex].imgNo; + vector neigRelatedNos = _matchNetList[neigImgNo].relatedImgs; + for (int k = 0; k < neigRelatedNos.size(); k ++) + { + if (neigRelatedNos[k] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[k]; + break; + } + } + + int curse0 = i-sIndex, curse1 = neigIndex-sIndex; + int fillPos0 = curse0*8, fillPos1 = curse1*8; + //! case 1 : with a fixed image + if (neigIndex < sIndex) + { + Utils::pointTransform(_alignModelList[neigIndex], neigPts); + for (int t = 0; t < curPts.size(); t += 3) + { + int x0 = curPts[t].x, y0 = curPts[t].y, x1 = neigPts[t].x, y1 = neigPts[t].y; + double hX0 = X[fillPos0+0]*x0 + X[fillPos0+1]*y0 + X[fillPos0+2]; //! h1*x0 + h2*y0 + h3 + double hY0 = X[fillPos0+3]*x0 + X[fillPos0+4]*y0 + X[fillPos0+5]; //! h4*x0 + h5*y0 + h6 + double hW0 = X[fillPos0+6]*x0 + X[fillPos0+7]*y0 + 1; //! h7*x0 + h8*y0 + 1 + + //! for : x = ... + //A(2*rn,fillPos0) = (1+lambada)*x0/hW0; A(2*rn,fillPos0+1) = (1+lambada)*y0/hW0; A(2*rn,fillPos0+2) = (1+lambada)*1/hW0; + //A(2*rn,fillPos0+6) = -(1+lambada)*x0*hX0/(hW0*hW0); A(2*rn,fillPos0+7) = -(1+lambada)*y0*hX0/(hW0*hW0); + APtr[2*rn*paramNum+fillPos0] = (1+lambada)*x0/hW0; APtr[2*rn*paramNum+fillPos0+1] = (1+lambada)*y0/hW0; APtr[2*rn*paramNum+fillPos0+2] = (1+lambada)*1/hW0; + APtr[2*rn*paramNum+fillPos0+6] = -(1+lambada)*x0*hX0/(hW0*hW0); APtr[2*rn*paramNum+fillPos0+7] = -(1+lambada)*y0*hX0/(hW0*hW0); + double orgx0 = initX[6*curse0+0]*x0 + initX[6*curse0+1]*y0 + initX[6*curse0+2]; + //L(2*rn) = lambada*(orgx0)+x1 - ((1+lambada)*hX0/hW0); + LPtr[2*rn] = lambada*(orgx0)+x1 - ((1+lambada)*hX0/hW0); + + //! for : y = ... + //A(2*rn+1,fillPos0+3) = (1+lambada)*x0/hW0; A(2*rn+1,fillPos0+4) = (1+lambada)*y0/hW0; A(2*rn+1,fillPos0+5) = (1+lambada)*1/hW0; + //A(2*rn+1,fillPos0+6) = -(1+lambada)*x0*hY0/(hW0*hW0); A(2*rn+1,fillPos0+7) = -(1+lambada)*y0*hY0/(hW0*hW0); + APtr[(2*rn+1)*paramNum+fillPos0+3] = (1+lambada)*x0/hW0; APtr[(2*rn+1)*paramNum+fillPos0+4] = (1+lambada)*y0/hW0; APtr[(2*rn+1)*paramNum+fillPos0+5] = (1+lambada)*1/hW0; + APtr[(2*rn+1)*paramNum+fillPos0+6] = -(1+lambada)*x0*hY0/(hW0*hW0); APtr[(2*rn+1)*paramNum+fillPos0+7] = -(1+lambada)*y0*hY0/(hW0*hW0); + double orgy0 = initX[6*curse0+3]*x0 + initX[6*curse0+4]*y0 + initX[6*curse0+5]; + //L(2*rn+1) = lambada*(orgy0)+y1 - ((1+lambada)*hY0/hW0); + LPtr[2*rn+1] = lambada*(orgy0)+y1 - ((1+lambada)*hY0/hW0); + + double bias = (L(2*rn)*L(2*rn) + L(2*rn+1)*L(2*rn+1)); + meanBias += sqrt(bias); + rn ++; + } + continue; + } + + //! case 2 : with a remain optimized image + for (int t = 0; t < curPts.size(); t += 3) + { + int x0 = curPts[t].x, y0 = curPts[t].y, x1 = neigPts[t].x, y1 = neigPts[t].y; + double hX0 = X[fillPos0+0]*x0 + X[fillPos0+1]*y0 + X[fillPos0+2]; //! h1*x0 + h2*y0 + h3 + double hY0 = X[fillPos0+3]*x0 + X[fillPos0+4]*y0 + X[fillPos0+5]; //! h4*x0 + h5*y0 + h6 + double hW0 = X[fillPos0+6]*x0 + X[fillPos0+7]*y0 + 1; //! h7*x0 + h8*y0 + 1 + + double hX1 = X[fillPos1+0]*x1 + X[fillPos1+1]*y1 + X[fillPos1+2]; //! h1'*x1 + h2'*y1 + h3' + double hY1 = X[fillPos1+3]*x1 + X[fillPos1+4]*y1 + X[fillPos1+5]; //! h4'*x1 + h5'*y1 + h6' + double hW1 = X[fillPos1+6]*x1 + X[fillPos1+7]*y1 + 1; //! h7'*x1 + h8'*y1 + 1 + + //! for : x = ... + //! cur-image + //A(2*rn,fillPos0) = (1+lambada)*x0/hW0; A(2*rn,fillPos0+1) = (1+lambada)*y0/hW0; A(2*rn,fillPos0+2) = (1+lambada)*1/hW0; + //A(2*rn,fillPos0+6) = -(1+lambada)*x0*hX0/(hW0*hW0); A(2*rn,fillPos0+7) = -(1+lambada)*y0*hX0/(hW0*hW0); + APtr[2*rn*paramNum+fillPos0] = (1+lambada)*x0/hW0; APtr[2*rn*paramNum+fillPos0+1] = (1+lambada)*y0/hW0; APtr[2*rn*paramNum+fillPos0+2] = (1+lambada)*1/hW0; + APtr[2*rn*paramNum+fillPos0+6] = -(1+lambada)*x0*hX0/(hW0*hW0); APtr[2*rn*paramNum+fillPos0+7] = -(1+lambada)*y0*hX0/(hW0*hW0); + //! neig-image + //A(2*rn,fillPos1) = (lambada-1)*x1/hW1; A(2*rn,fillPos1+1) = (lambada-1)*y1/hW1; A(2*rn,fillPos1+2) = (lambada-1)*1/hW1; + //A(2*rn,fillPos1+6) = -(lambada-1)*x1*hX1/(hW1*hW1); A(2*rn,fillPos1+7) = -(lambada-1)*y1*hX1/(hW1*hW1); + APtr[2*rn*paramNum+fillPos1] = (lambada-1)*x1/hW1; APtr[2*rn*paramNum+fillPos1+1] = (lambada-1)*y1/hW1; APtr[2*rn*paramNum+fillPos1+2] = (lambada-1)*1/hW1; + APtr[2*rn*paramNum+fillPos1+6] = -(lambada-1)*x1*hX1/(hW1*hW1); APtr[2*rn*paramNum+fillPos1+7] = -(lambada-1)*y1*hX1/(hW1*hW1); + + double orgx0 = initX[6*curse0+0]*x0 + initX[6*curse0+1]*y0 + initX[6*curse0+2]; + double orgx1 = initX[6*curse1+0]*x1 + initX[6*curse1+1]*y1 + initX[6*curse1+2]; + //L(2*rn) = lambada*(orgx0+orgx1) - ((1+lambada)*hX0/hW0 + (lambada-1)*hX1/hW1); + LPtr[2*rn] = lambada*(orgx0+orgx1) - ((1+lambada)*hX0/hW0 + (lambada-1)*hX1/hW1); + + //! for : y = ... + //! cur-image + //A(2*rn+1,fillPos0+3) = (1+lambada)*x0/hW0; A(2*rn+1,fillPos0+4) = (1+lambada)*y0/hW0; A(2*rn+1,fillPos0+5) = (1+lambada)*1/hW0; + //A(2*rn+1,fillPos0+6) = -(1+lambada)*x0*hY0/(hW0*hW0); A(2*rn+1,fillPos0+7) = -(1+lambada)*y0*hY0/(hW0*hW0); + APtr[(2*rn+1)*paramNum+fillPos0+3] = (1+lambada)*x0/hW0; APtr[(2*rn+1)*paramNum+fillPos0+4] = (1+lambada)*y0/hW0; APtr[(2*rn+1)*paramNum+fillPos0+5] = (1+lambada)*1/hW0; + APtr[(2*rn+1)*paramNum+fillPos0+6] = -(1+lambada)*x0*hY0/(hW0*hW0); APtr[(2*rn+1)*paramNum+fillPos0+7] = -(1+lambada)*y0*hY0/(hW0*hW0); + //! neig-image + //A(2*rn+1,fillPos1+3) = (lambada-1)*x1/hW1; A(2*rn+1,fillPos1+4) = (lambada-1)*y1/hW1; A(2*rn+1,fillPos1+5) = (lambada-1)*1/hW1; + //A(2*rn+1,fillPos1+6) = -(lambada-1)*x1*hY1/(hW1*hW1); A(2*rn+1,fillPos1+7) = -(lambada-1)*y1*hY1/(hW1*hW1); + APtr[(2*rn+1)*paramNum+fillPos1+3] = (lambada-1)*x1/hW1; APtr[(2*rn+1)*paramNum+fillPos1+4] = (lambada-1)*y1/hW1; APtr[(2*rn+1)*paramNum+fillPos1+5] = (lambada-1)*1/hW1; + APtr[(2*rn+1)*paramNum+fillPos1+6] = -(lambada-1)*x1*hY1/(hW1*hW1); APtr[(2*rn+1)*paramNum+fillPos1+7] = -(lambada-1)*y1*hY1/(hW1*hW1); + + double orgy0 = initX[6*curse0+3]*x0 + initX[6*curse0+4]*y0 + initX[6*curse0+5]; + double orgy1 = initX[6*curse1+3]*x1 + initX[6*curse1+4]*y1 + initX[6*curse1+5]; + //L(2*rn+1) = lambada*(orgy0+orgy1) - ((1+lambada)*hY0/hW0 + (lambada-1)*hY1/hW1); + LPtr[2*rn+1] = lambada*(orgy0+orgy1) - ((1+lambada)*hY0/hW0 + (lambada-1)*hY1/hW1); + + double bias = (L(2*rn)*L(2*rn) + L(2*rn+1)*L(2*rn+1)); + meanBias += sqrt(bias); + rn ++; + } + } + } + meanBias = meanBias/rn; + cout<<"Iteration: "< At = A.t(); + Mat_ dX = (At*A).inv()*(At*L); + // cout< > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + if (relatedNos[j] < i) //! avoid repeating counting + { + int num = pointSet[j].size(); + num = num%3 == 0 ? (num/3) : (num/3+1); + measureNum += num; //! only 1/3 of matching pairs for optimization + } + } + } + int paramNum = 8*(eIndex-sIndex+1); //! optimizing homgraphic model with 8 DoF + double *X = new double[paramNum]; + double *initX = new double[6*(eIndex-sIndex+1)]; + buildIniSolution(X, initX, sIndex, eIndex); + //! parameters setting of least square optimization + double lambada = Lambada; + int max_iters = 10; + + int rn = 0, ite = 0; + while (1) + { + double meanBias = 0; + rn = 0; + Mat_ AtA = Mat(paramNum, paramNum, CV_64FC1, Scalar(0)); + Mat_ AtL = Mat(paramNum, 1, CV_64FC1, Scalar(0)); + for (int i = sIndex; i <= eIndex; i ++) + { + //! prepare relative data or parameters of current image + int imgNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[imgNo].PointSet; + vector relatedNos = _matchNetList[imgNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + int neigIndex = relatedNos[j]; + if (neigIndex > i) + { + continue; + } + vector curPts, neigPts; + curPts = pointSet[j]; + int neigImgNo = _visitOrder[neigIndex].imgNo; + vector neigRelatedNos = _matchNetList[neigImgNo].relatedImgs; + for (int k = 0; k < neigRelatedNos.size(); k ++) + { + if (neigRelatedNos[k] == i) + { + neigPts = _matchNetList[neigImgNo].PointSet[k]; + break; + } + } + + int curse0 = i-sIndex, curse1 = neigIndex-sIndex; + int fillPos0 = curse0*8, fillPos1 = curse1*8; + int num = curPts.size(), n = 0; + Mat_ Ai = Mat(2*num, paramNum, CV_64FC1, Scalar(0)); + Mat_ Li = Mat(2*num, 1, CV_64FC1, Scalar(0)); + double *AiPtr = (double*)Ai.data; + double *LiPtr = (double*)Li.data; + //! case 1 : with a fixed image + if (neigIndex < sIndex) + { + Utils::pointTransform(_alignModelList[neigIndex], neigPts); + for (int t = 0; t < curPts.size(); t += 3) + { + int x0 = curPts[t].x, y0 = curPts[t].y, x1 = neigPts[t].x, y1 = neigPts[t].y; + double hX0 = X[fillPos0+0]*x0 + X[fillPos0+1]*y0 + X[fillPos0+2]; //! h1*x0 + h2*y0 + h3 + double hY0 = X[fillPos0+3]*x0 + X[fillPos0+4]*y0 + X[fillPos0+5]; //! h4*x0 + h5*y0 + h6 + double hW0 = X[fillPos0+6]*x0 + X[fillPos0+7]*y0 + 1; //! h7*x0 + h8*y0 + 1 + + //! for : x = ... + AiPtr[2*n*paramNum+fillPos0] = (1+lambada)*x0/hW0; + AiPtr[2*n*paramNum+fillPos0+1] = (1+lambada)*y0/hW0; + AiPtr[2*n*paramNum+fillPos0+2] = (1+lambada)*1/hW0; + AiPtr[2*n*paramNum+fillPos0+6] = -(1+lambada)*x0*hX0/(hW0*hW0); + AiPtr[2*n*paramNum+fillPos0+7] = -(1+lambada)*y0*hX0/(hW0*hW0); + double orgx0 = initX[6*curse0+0]*x0 + initX[6*curse0+1]*y0 + initX[6*curse0+2]; + + LiPtr[2*n] = lambada*(orgx0)+x1 - ((1+lambada)*hX0/hW0); + + //! for : y = ... + AiPtr[(2*n+1)*paramNum+fillPos0+3] = (1+lambada)*x0/hW0; + AiPtr[(2*n+1)*paramNum+fillPos0+4] = (1+lambada)*y0/hW0; + AiPtr[(2*n+1)*paramNum+fillPos0+5] = (1+lambada)*1/hW0; + AiPtr[(2*n+1)*paramNum+fillPos0+6] = -(1+lambada)*x0*hY0/(hW0*hW0); + AiPtr[(2*n+1)*paramNum+fillPos0+7] = -(1+lambada)*y0*hY0/(hW0*hW0); + double orgy0 = initX[6*curse0+3]*x0 + initX[6*curse0+4]*y0 + initX[6*curse0+5]; + + LiPtr[2*n+1] = lambada*(orgy0)+y1 - ((1+lambada)*hY0/hW0); + + double bias = (LiPtr[2*n]*LiPtr[2*n] + LiPtr[2*n+1]*LiPtr[2*n+1]); + meanBias += sqrt(bias); + n ++; + rn ++; + } + //! get in normal equation matrix + Mat_ Ait = Ai.t(); + Mat_ barA = Ait*Ai, barL = Ait*Li; + AtA += barA; + AtL += barL; + + continue; + } + + //! case 2 : with a remain optimized image + for (int t = 0; t < curPts.size(); t += 3) + { + int x0 = curPts[t].x, y0 = curPts[t].y, x1 = neigPts[t].x, y1 = neigPts[t].y; + double hX0 = X[fillPos0+0]*x0 + X[fillPos0+1]*y0 + X[fillPos0+2]; //! h1*x0 + h2*y0 + h3 + double hY0 = X[fillPos0+3]*x0 + X[fillPos0+4]*y0 + X[fillPos0+5]; //! h4*x0 + h5*y0 + h6 + double hW0 = X[fillPos0+6]*x0 + X[fillPos0+7]*y0 + 1; //! h7*x0 + h8*y0 + 1 + + double hX1 = X[fillPos1+0]*x1 + X[fillPos1+1]*y1 + X[fillPos1+2]; //! h1'*x1 + h2'*y1 + h3' + double hY1 = X[fillPos1+3]*x1 + X[fillPos1+4]*y1 + X[fillPos1+5]; //! h4'*x1 + h5'*y1 + h6' + double hW1 = X[fillPos1+6]*x1 + X[fillPos1+7]*y1 + 1; //! h7'*x1 + h8'*y1 + 1 + + //! for : x = ... + //! cur-image + AiPtr[2*n*paramNum+fillPos0] = (1+lambada)*x0/hW0; + AiPtr[2*n*paramNum+fillPos0+1] = (1+lambada)*y0/hW0; + AiPtr[2*n*paramNum+fillPos0+2] = (1+lambada)*1/hW0; + AiPtr[2*n*paramNum+fillPos0+6] = -(1+lambada)*x0*hX0/(hW0*hW0); + AiPtr[2*n*paramNum+fillPos0+7] = -(1+lambada)*y0*hX0/(hW0*hW0); + //! neig-image + AiPtr[2*n*paramNum+fillPos1] = (lambada-1)*x1/hW1; + AiPtr[2*n*paramNum+fillPos1+1] = (lambada-1)*y1/hW1; + AiPtr[2*n*paramNum+fillPos1+2] = (lambada-1)*1/hW1; + AiPtr[2*n*paramNum+fillPos1+6] = -(lambada-1)*x1*hX1/(hW1*hW1); + AiPtr[2*n*paramNum+fillPos1+7] = -(lambada-1)*y1*hX1/(hW1*hW1); + + double orgx0 = initX[6*curse0+0]*x0 + initX[6*curse0+1]*y0 + initX[6*curse0+2]; + double orgx1 = initX[6*curse1+0]*x1 + initX[6*curse1+1]*y1 + initX[6*curse1+2]; + + LiPtr[2*n] = lambada*(orgx0+orgx1) - ((1+lambada)*hX0/hW0 + (lambada-1)*hX1/hW1); + + //! for : y = ... + //! cur-image + AiPtr[(2*n+1)*paramNum+fillPos0+3] = (1+lambada)*x0/hW0; + AiPtr[(2*n+1)*paramNum+fillPos0+4] = (1+lambada)*y0/hW0; + AiPtr[(2*n+1)*paramNum+fillPos0+5] = (1+lambada)*1/hW0; + AiPtr[(2*n+1)*paramNum+fillPos0+6] = -(1+lambada)*x0*hY0/(hW0*hW0); + AiPtr[(2*n+1)*paramNum+fillPos0+7] = -(1+lambada)*y0*hY0/(hW0*hW0); + //! neig-image + AiPtr[(2*n+1)*paramNum+fillPos1+3] = (lambada-1)*x1/hW1; + AiPtr[(2*n+1)*paramNum+fillPos1+4] = (lambada-1)*y1/hW1; + AiPtr[(2*n+1)*paramNum+fillPos1+5] = (lambada-1)*1/hW1; + AiPtr[(2*n+1)*paramNum+fillPos1+6] = -(lambada-1)*x1*hY1/(hW1*hW1); + AiPtr[(2*n+1)*paramNum+fillPos1+7] = -(lambada-1)*y1*hY1/(hW1*hW1); + + double orgy0 = initX[6*curse0+3]*x0 + initX[6*curse0+4]*y0 + initX[6*curse0+5]; + double orgy1 = initX[6*curse1+3]*x1 + initX[6*curse1+4]*y1 + initX[6*curse1+5]; + + LiPtr[2*n+1] = lambada*(orgy0+orgy1) - ((1+lambada)*hY0/hW0 + (lambada-1)*hY1/hW1); + + double bias = (LiPtr[2*n]*LiPtr[2*n] + LiPtr[2*n+1]*LiPtr[2*n+1]); + meanBias += sqrt(bias); + n ++; + rn ++; + } + //! get in normal equation matrix + Mat_ Ait = Ai.t(); + Mat_ barA = Ait*Ai, barL = Ait*Li; + AtA += barA; + AtL += barL; + } + } + meanBias = meanBias/rn; + cout<<"Iteration: "< dX = AtA.inv()*AtL; + double *dXPtr = (double*)dX.data; + // cout< tempMat = _alignModelList[i]; + double *data = (double*)tempMat.data; + for (int j = 0; j < 8; j ++) + { + X[cnt++] = data[j]; + } + } + cnt = 0; + for (int i = sIndex; i <= eIndex; i ++) + { + Mat_ tempMat = _initModelList[i]; + double *data = (double*)tempMat.data; + for (int j = 0; j < 6; j ++) + { + initX[cnt++] = data[j]; + } + } +} + + +void ImageAligner::buildIniSolution(double* X, int sIndex, int eIndex) +{ + int cnt = 0; + for (int i = sIndex; i <= eIndex; i ++) + { + Mat_ tempMat = _alignModelList[i]; + double *data = (double*)tempMat.data; + for (int j = 0; j < 8; j ++) + { + X[cnt++] = data[j]; + } + } +} + + +void ImageAligner::RefineAligningModels(int sIndex, int eIndex) +{ + int m = 0, n = 0, max_its = 200; + m = (eIndex-sIndex+1) * 8; //without optimizing the start one + for (int i = sIndex; i <= eIndex; i ++) + { + int curNo = _visitOrder[i].imgNo; + vector > pointSet = _matchNetList[curNo].PointSet; + vector relatedNos = _matchNetList[curNo].relatedImgs; + for (int j = 0; j < relatedNos.size(); j ++) + { + if (relatedNos[j] < i) + { + //! using only one third of corresponding for optimization + n += pointSet[j].size()/3; + } + } + } + double *d = new double[n]; + for (int i = 0; i < n; i ++) + { + d[i] = 0; + } + double *X = new double[m]; + buildIniSolution(X, sIndex, eIndex); + + LMData *LMInput = new LMData; //! prepare input data for optimization + LMInput->sIndex = sIndex; + LMInput->eIndex = eIndex; + LMInput->matchPtr = &_matchNetList; + LMInput->modelPtr = &_alignModelList; + LMInput->visitOrder = _visitOrder; + + double opts[LM_OPTS_SZ], info[LM_INFO_SZ]; + opts[0]=1E-20; opts[1]=1E-30; opts[2]=1E-30; opts[3]=1E-30; opts[4]= 1e-9; + int ret = dlevmar_dif(OptimizationFunction, X, d, m, n, max_its, opts, info, NULL, NULL, (void*)LMInput); + for (int i = sIndex; i <= eIndex; i ++) //stock optimized homographic matrix + { + double *homoVec = X + 8*(i-sIndex); + Mat_ homoMat(3,3,CV_64FC1); + homoMat(0,0) = homoVec[0]; homoMat(0,1) = homoVec[1]; homoMat(0,2) = homoVec[2]; + homoMat(1,0) = homoVec[3]; homoMat(1,1) = homoVec[4]; homoMat(1,2) = homoVec[5]; + homoMat(2,0) = homoVec[6]; homoMat(2,1) = homoVec[7]; homoMat(2,2) = 1.0; + _alignModelList[i] = homoMat; + } + + delete []d; //free stack + delete []X; + delete LMInput; + cout<<"Optimization done with iterations("< *matchNetPtr = dataPtr->matchPtr; + int startIndex = dataPtr->sIndex, endIndex = dataPtr->eIndex; + vector > *modelListPtr = dataPtr->modelPtr; + vector visitOrder = dataPtr->visitOrder; + int cnt = 0; + double meanError = 0; + for (int i = startIndex; i <= endIndex; i ++) //without the start image + { + int curNo = visitOrder[i].imgNo; + Match_Net matchNet = (*matchNetPtr)[curNo]; + vector relatedImgs = matchNet.relatedImgs; + double *homoVec1, *homoVec2; + double *iniHomoVec1, *iniHomoVec2; + homoVec1 = X + 8*(i-startIndex); + iniHomoVec1 = (double*)(*modelListPtr)[i].data; + for (int j = 0; j < relatedImgs.size(); j ++) + { + int neigIndex = relatedImgs[j]; + if (neigIndex > i) + { + continue; + } + vector ptSet1, ptSet2; + ptSet1 = matchNet.PointSet[j]; //! points on cur_image + int neigNo = visitOrder[neigIndex].imgNo; + Match_Net neigMatchNet = (*matchNetPtr)[neigNo]; + for (int k = 0; k < neigMatchNet.relatedImgs.size(); k ++) + { + if (neigMatchNet.relatedImgs[k] == i) + { + ptSet2 = neigMatchNet.PointSet[k]; + break; + } + } + bool fixedNeigh = false; + if (neigIndex < startIndex) + { + double *data = (double*)(*modelListPtr)[neigIndex].data; + homoVec2 = data; + fixedNeigh = true; + } + else + { + homoVec2 = X + 8*(neigIndex-startIndex); + iniHomoVec2 = (double*)(*modelListPtr)[neigIndex].data; + } + //! using only one third of corresponding for optimization + for (int t = 0; t < ptSet1.size(); t += 3) + { + double x1 = ptSet1[t].x, y1 = ptSet1[t].y; + double x2 = ptSet2[t].x, y2 = ptSet2[t].y; + double mosaic_x1 = (homoVec1[0]*x1 + homoVec1[1]*y1 + homoVec1[2])/(homoVec1[6]*x1 + homoVec1[7]*y1 + 1.0); + double mosaic_y1 = (homoVec1[3]*x1 + homoVec1[4]*y1 + homoVec1[5])/(homoVec1[6]*x1 + homoVec1[7]*y1 + 1.0); + double mosaic_x2 = (homoVec2[0]*x2 + homoVec2[1]*y2 + homoVec2[2])/(homoVec2[6]*x2 + homoVec2[7]*y2 + 1.0); + double mosaic_y2 = (homoVec2[3]*x2 + homoVec2[4]*y2 + homoVec2[5])/(homoVec2[6]*x2 + homoVec2[7]*y2 + 1.0); + double bias = sqrt((mosaic_x1-mosaic_x2)*(mosaic_x1-mosaic_x2)+(mosaic_y1-mosaic_y2)*(mosaic_y1-mosaic_y2)); + + //! perspective penalty items + double penalty = 0; + if (!fixedNeigh) + { + double iniMosaic_x1 = (iniHomoVec1[0]*x1 + iniHomoVec1[1]*y1 + iniHomoVec1[2])/(iniHomoVec1[6]*x1 + iniHomoVec1[7]*y1 + 1.0); + double iniMosaic_y1 = (iniHomoVec1[3]*x1 + iniHomoVec1[4]*y1 + iniHomoVec1[5])/(iniHomoVec1[6]*x1 + iniHomoVec1[7]*y1 + 1.0); + double iniMosaic_x2 = (iniHomoVec2[0]*x2 + iniHomoVec2[1]*y2 + iniHomoVec2[2])/(iniHomoVec2[6]*x2 + iniHomoVec2[7]*y2 + 1.0); + double iniMosaic_y2 = (iniHomoVec2[3]*x2 + iniHomoVec2[4]*y2 + iniHomoVec2[5])/(iniHomoVec2[6]*x2 + iniHomoVec2[7]*y2 + 1.0); + double penalty1 = sqrt((mosaic_x1-iniMosaic_x1)*(mosaic_x1-iniMosaic_x1)+(mosaic_y1-iniMosaic_y1)*(mosaic_y1-iniMosaic_y1)); + double penalty2 = sqrt((mosaic_x2-iniMosaic_x2)*(mosaic_x2-iniMosaic_x2)+(mosaic_y2-iniMosaic_y2)*(mosaic_y2-iniMosaic_y2)); + penalty = (penalty1 + penalty2)/2; + } + else + { + double iniMosaic_x1 = (iniHomoVec1[0]*x1 + iniHomoVec1[1]*y1 + iniHomoVec1[2])/(iniHomoVec1[6]*x1 + iniHomoVec1[7]*y1 + 1.0); + double iniMosaic_y1 = (iniHomoVec1[3]*x1 + iniHomoVec1[4]*y1 + iniHomoVec1[5])/(iniHomoVec1[6]*x1 + iniHomoVec1[7]*y1 + 1.0); + penalty = sqrt((mosaic_x1-iniMosaic_x1)*(mosaic_x1-iniMosaic_x1)+(mosaic_y1-iniMosaic_y1)*(mosaic_y1-iniMosaic_y1)); + } + d[cnt++] = bias + PENALTY_COEFF*penalty; + meanError += bias; + } + } + } + meanError /= cnt; + cout<<"current mean-warping-bias is: "< &nodePts) +{ + vector marginPtList; + int i, j; + for (i = 0; i < _imgNum; i ++) + { + Mat_ homoMat = _alignModelList[i]; + int curImgNo = _visitOrder[i].imgNo; + Size imgSize = _imgSizeList[curImgNo]; + int height = imgSize.height, width = imgSize.width; + Point2d srcPt00(0,0), srcPt01(width,0), srcPt10(0,height), srcPt11(width,height); + Point2d dstPt00, dstPt01, dstPt10, dstPt11; + Utils::pointTransform(homoMat, srcPt00, dstPt00); + Utils::pointTransform(homoMat, srcPt01, dstPt01); + Utils::pointTransform(homoMat, srcPt10, dstPt10); + Utils::pointTransform(homoMat, srcPt11, dstPt11); + marginPtList.push_back(dstPt00); + marginPtList.push_back(dstPt01); + marginPtList.push_back(dstPt10); + marginPtList.push_back(dstPt11); + if (i != 0) + { + nodePts.push_back(dstPt10); + nodePts.push_back(dstPt11); + } + } + int minX = 999, minY = 999, maxX = 0, maxY = 0; + for (i = 0; i < marginPtList.size(); i ++) + { + Point2d tmpPt = marginPtList[i]; + int x = int(fabs(tmpPt.x)+1)*(tmpPt.x < 0 ? -1 : 1); + int y = int(fabs(tmpPt.y)+1)*(tmpPt.y < 0 ? -1 : 1); + if (x > maxX) + maxX = x; + if (x < minX) + minX = x; + if (y > maxY) + maxY = y; + if (y < minY) + minY = y; + } + for (i = 0; i < nodePts.size(); i ++) + { + nodePts[i].x -= minX; + nodePts[i].y -= minY; + } + Rect mosaicRect; + mosaicRect.x = minX; mosaicRect.y = minY; + mosaicRect.width = maxX-minX+1; mosaicRect.height = maxY-minY+1; + return mosaicRect; +} + + +void ImageAligner::saveMosaicImage() +{ + cout<<"#Warping sequential images ..."< nodePts; + Rect mosaicRect = setImageSize(nodePts); + int newRow = mosaicRect.height, newCol = mosaicRect.width; + int i, j; + Rect newImgRect; + Mat stitchImage(newRow, newCol, CV_8UC3, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX)); + uchar *mosaicData = (uchar*)stitchImage.data; + for (i = 0; i < _imgNum; i ++) + { + int curImgNo = _visitOrder[i].imgNo; + cout<<"Warping Image: "< homoMat = _alignModelList[i]; + Size imgSize = _imgSizeList[curImgNo]; + int height = imgSize.height, width = imgSize.width; + Point2d srcPt00(0,0), srcPt01(width,0), srcPt10(0,height), srcPt11(width,height); + Point2d dstPt00, dstPt01, dstPt10, dstPt11; + Utils::pointTransform(homoMat, srcPt00, dstPt00); + Utils::pointTransform(homoMat, srcPt01, dstPt01); + Utils::pointTransform(homoMat, srcPt10, dstPt10); + Utils::pointTransform(homoMat, srcPt11, dstPt11); + + double fminX, fminY, fmaxX, fmaxY; + fminX = min(min(dstPt00.x, dstPt01.x), min(dstPt10.x, dstPt11.x)); + fmaxX = max(max(dstPt00.x, dstPt01.x), max(dstPt10.x, dstPt11.x)); + fminY = min(min(dstPt00.y, dstPt01.y), min(dstPt10.y, dstPt11.y)); + fmaxY = max(max(dstPt00.y, dstPt01.y), max(dstPt10.y, dstPt11.y)); + int minX, minY, maxX, maxY; + minX = int(fabs(fminX)+1)*(fminX < 0 ? -1 : 1); + maxX = int(fabs(fmaxX)+1)*(fmaxX < 0 ? -1 : 1); + minY = int(fabs(fminY)+1)*(fminY < 0 ? -1 : 1); + maxY = int(fabs(fmaxY)+1)*(fmaxY < 0 ? -1 : 1); + + int startX = minX-mosaicRect.x; int endX = startX+maxX-minX; + int startY = minY-mosaicRect.y; int endY = startY+maxY-minY; + int r, c; + Mat warpedImage; + if (needMask && needAlpha) + { + warpedImage = Mat(newRow, newCol, CV_8UC4, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX,0)); + } + else if (needMask && !needAlpha) + { + warpedImage = Mat(newRow, newCol, CV_8UC3, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX)); + } + uchar *curWarpData = (uchar*)warpedImage.data; + + string filePath = _filePathList[curImgNo]; + Mat image = imread(filePath); + uchar *curImgData = (uchar*)image.data; + Mat_ invHomoMat = homoMat.inv(); + for (r = startY; r < endY; r ++) + { + for (c = startX; c < endX; c ++) + { + int grayValueR, grayValueG, grayValueB; + Point2d dstPt(c+mosaicRect.x,r+mosaicRect.y), srcPt(0,0); + Utils::pointTransform(invHomoMat, dstPt, srcPt); + int u = int(srcPt.x), v = int(srcPt.y); + if (0 < u && width-1 > u && 0 < v && height-1 > v) + { + int grayValueR1 = 0, grayValueR2 = 0; + int grayValueG1 = 0, grayValueG2 = 0; + int grayValueB1 = 0, grayValueB2 = 0; + + //bilinear interpolation + grayValueR1 = curImgData[3*(v*width+u)+0]*(1-(srcPt.x-u)) + curImgData[3*(v*width+u+1)+0]*(srcPt.x-u); + grayValueG1 = curImgData[3*(v*width+u)+1]*(1-(srcPt.x-u)) + curImgData[3*(v*width+u+1)+1]*(srcPt.x-u); + grayValueB1 = curImgData[3*(v*width+u)+2]*(1-(srcPt.x-u)) + curImgData[3*(v*width+u+1)+2]*(srcPt.x-u); + + grayValueR2 = curImgData[3*((v+1)*width+u)+0]*(1-(srcPt.x-u)) + curImgData[3*((v+1)*width+(u+1))+0]*(srcPt.x-u); + grayValueG2 = curImgData[3*((v+1)*width+u)+1]*(1-(srcPt.x-u)) + curImgData[3*((v+1)*width+(u+1))+1]*(srcPt.x-u); + grayValueB2 = curImgData[3*((v+1)*width+u)+2]*(1-(srcPt.x-u)) + curImgData[3*((v+1)*width+(u+1))+2]*(srcPt.x-u); + + grayValueR = grayValueR1*(1-(srcPt.y-v)) + grayValueR2*(srcPt.y-v); + grayValueG = grayValueG1*(1-(srcPt.y-v)) + grayValueG2*(srcPt.y-v); + grayValueB = grayValueB1*(1-(srcPt.y-v)) + grayValueB2*(srcPt.y-v); + + if (needMask) + { + if (!needAlpha) + { + curWarpData[3*(r*newCol+c)+0] = grayValueR; + curWarpData[3*(r*newCol+c)+1] = grayValueG; + curWarpData[3*(r*newCol+c)+2] = grayValueB; + } + else + { + warpedImage.at(r,c)[3] = 255; //! for alpha channel + warpedImage.at(r,c)[0] = grayValueR; //! B + warpedImage.at(r,c)[1] = grayValueG; //! G + warpedImage.at(r,c)[2] = grayValueB; //! R + } + } + //! set for the mosaic image + mosaicData[3*(r*newCol+c)+0] = grayValueR; + mosaicData[3*(r*newCol+c)+1] = grayValueG; + mosaicData[3*(r*newCol+c)+2] = grayValueB; + } + } + } + if (!needMask) + { + continue; + } + char name[512]; + sprintf(name,"/Masks/warp%03d.png", curImgNo); + string savePath = Utils::baseDir + string(name); + imwrite(savePath, warpedImage); + } + + string filePath = Utils::baseDir + "/mosaic.png"; + imwrite(filePath, stitchImage); + cout<<"-Completed!"< nodePts; + Rect mosaicRect = setImageSize(nodePts); + int newRow = mosaicRect.height, newCol = mosaicRect.width; + int i, j; + Rect newImgRect; + Mat stitchImage(newRow, newCol, CV_8UC3, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX)); + uchar *mosaicData = (uchar*)stitchImage.data; + Rect refRect; + for (i = 0; i < _imgNum; i ++) + { + int curImgNo = i; + int curIndex = findVisitIndex(curImgNo); + cout<<"Warping Image: "< homoMat = _alignModelList[curIndex]; + Size imgSize = _imgSizeList[curImgNo]; + int height = imgSize.height, width = imgSize.width; + Point2d srcPt00(0,0), srcPt01(width,0), srcPt10(0,height), srcPt11(width,height); + Point2d dstPt00, dstPt01, dstPt10, dstPt11; + Utils::pointTransform(homoMat, srcPt00, dstPt00); + Utils::pointTransform(homoMat, srcPt01, dstPt01); + Utils::pointTransform(homoMat, srcPt10, dstPt10); + Utils::pointTransform(homoMat, srcPt11, dstPt11); + + double fminX, fminY, fmaxX, fmaxY; + fminX = min(min(dstPt00.x, dstPt01.x), min(dstPt10.x, dstPt11.x)); + fmaxX = max(max(dstPt00.x, dstPt01.x), max(dstPt10.x, dstPt11.x)); + fminY = min(min(dstPt00.y, dstPt01.y), min(dstPt10.y, dstPt11.y)); + fmaxY = max(max(dstPt00.y, dstPt01.y), max(dstPt10.y, dstPt11.y)); + int minX, minY, maxX, maxY; + minX = int(fabs(fminX)+1)*(fminX < 0 ? -1 : 1); + maxX = int(fabs(fmaxX)+1)*(fmaxX < 0 ? -1 : 1); + minY = int(fabs(fminY)+1)*(fminY < 0 ? -1 : 1); + maxY = int(fabs(fmaxY)+1)*(fmaxY < 0 ? -1 : 1); + + int startX = minX-mosaicRect.x; int endX = startX+maxX-minX; + int startY = minY-mosaicRect.y; int endY = startY+maxY-minY; + if (i == _refImgNo) + { + refRect.x = startX; refRect.y = startY; + refRect.width = endX-startX+1; + refRect.height = endY-startY+1; + } + int r, c; + Mat warpedImage; + if (needMask && needAlpha) + { + warpedImage = Mat(newRow, newCol, CV_8UC4, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX,0)); + } + else if (needMask && !needAlpha) + { + warpedImage = Mat(newRow, newCol, CV_8UC3, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX)); + } + uchar *curWarpData = (uchar*)warpedImage.data; + string filePath = _filePathList[curImgNo]; + Mat image = imread(filePath); + uchar *curImgData = (uchar*)image.data; + Mat_ invHomoMat = homoMat.inv(); + for (r = startY; r < endY; r ++) + { + for (c = startX; c < endX; c ++) + { + int grayValueR, grayValueG, grayValueB; + Point2d dstPt(c+mosaicRect.x,r+mosaicRect.y), srcPt(0,0); + Utils::pointTransform(invHomoMat, dstPt, srcPt); + int u = int(srcPt.x), v = int(srcPt.y); + if (0+1 < u && width-2 > u && 0+1 < v && height-2 > v) + { + int grayValueR1 = 0, grayValueR2 = 0; + int grayValueG1 = 0, grayValueG2 = 0; + int grayValueB1 = 0, grayValueB2 = 0; + + //bilinear interpolation + grayValueR1 = curImgData[3*(v*width+u)+0]*(1-(srcPt.x-u)) + curImgData[3*(v*width+u+1)+0]*(srcPt.x-u); + grayValueG1 = curImgData[3*(v*width+u)+1]*(1-(srcPt.x-u)) + curImgData[3*(v*width+u+1)+1]*(srcPt.x-u); + grayValueB1 = curImgData[3*(v*width+u)+2]*(1-(srcPt.x-u)) + curImgData[3*(v*width+u+1)+2]*(srcPt.x-u); + + grayValueR2 = curImgData[3*((v+1)*width+u)+0]*(1-(srcPt.x-u)) + curImgData[3*((v+1)*width+(u+1))+0]*(srcPt.x-u); + grayValueG2 = curImgData[3*((v+1)*width+u)+1]*(1-(srcPt.x-u)) + curImgData[3*((v+1)*width+(u+1))+1]*(srcPt.x-u); + grayValueB2 = curImgData[3*((v+1)*width+u)+2]*(1-(srcPt.x-u)) + curImgData[3*((v+1)*width+(u+1))+2]*(srcPt.x-u); + + grayValueR = grayValueR1*(1-(srcPt.y-v)) + grayValueR2*(srcPt.y-v); + grayValueG = grayValueG1*(1-(srcPt.y-v)) + grayValueG2*(srcPt.y-v); + grayValueB = grayValueB1*(1-(srcPt.y-v)) + grayValueB2*(srcPt.y-v); + + if (needMask) + { + if (!needAlpha) + { + curWarpData[3*(r*newCol+c)+0] = grayValueR; + curWarpData[3*(r*newCol+c)+1] = grayValueG; + curWarpData[3*(r*newCol+c)+2] = grayValueB; + } + else + { + warpedImage.at(r,c)[3] = 255; //! for alpha channel + warpedImage.at(r,c)[0] = grayValueR; //! B + warpedImage.at(r,c)[1] = grayValueG; //! G + warpedImage.at(r,c)[2] = grayValueB; //! R + } + } + //! set for the mosaic image + mosaicData[3*(r*newCol+c)+0] = grayValueR; + mosaicData[3*(r*newCol+c)+1] = grayValueG; + mosaicData[3*(r*newCol+c)+2] = grayValueB; + } + } + } + if (!needMask) + { + continue; + } + char name[512]; + sprintf(name,"/Masks/warp%03d.png", curImgNo); + string savePath = Utils::baseDir + string(name); + imwrite(savePath, warpedImage); + } + + if (0) + { + rectangle(stitchImage, Point2d(refRect.x,refRect.y), Point2d(refRect.x+refRect.width,refRect.y+refRect.height), Scalar(0,0,255), 5); + } + string filePath = Utils::baseDir + "/mosaic.png"; + imwrite(filePath, stitchImage); + cout<<"-Completed!"< pointSet1, vector pointSet2, Mat_ cvtMat, vector weightList) +{ + unsigned i; + int ptNum = pointSet1.size(); + if (weightList.size() == 0) + { + for (i = 0; i < ptNum; i ++) + { + weightList.push_back(1.0); + } + } + double meanDist = 0, allWeight = 0; +// vector errorList; + for (i = 0; i < ptNum; i ++) //mean value + { + Point2d warpedPt; + Utils::pointTransform(cvtMat, pointSet2[i], warpedPt); + double dist = 0; + dist = sqrt((warpedPt.x-pointSet1[i].x)*(warpedPt.x-pointSet1[i].x) + (warpedPt.y-pointSet1[i].y)*(warpedPt.y-pointSet1[i].y)); + meanDist += dist*weightList[i]; + allWeight += weightList[i]; + } + meanDist /= allWeight; + return meanDist; +} + + +void ImageAligner::recheckTopology(int sIndex, int eIndex) +{ + cout<<"-Recheck potential topology ..."< affineMat = _alignModelList[i]; + //! calculating projecting centroid + Quadra bar; + bar.imgSize = _imgSizeList[curNo]; + Point2d centroid(bar.imgSize.width/2.0, bar.imgSize.height/2.0); + bar.centroid = Utils::pointTransform(affineMat, centroid); + _projCoordSet.push_back(bar); + + vector relatedNos = _matchNetList[curNo].relatedImgs; + //! check with previously aligned images, except for its known neighbors + for (int j = 0; j < sIndex; j ++) + { + bool isOldFriend = false; + for (int k = 0; k < relatedNos.size(); k ++) + { + if (relatedNos[k] == j) + { + isOldFriend = true; + break; + } + } + if (isOldFriend) + { + continue; + } + int testNo = _visitOrder[j].imgNo; + Quadra testObj = _projCoordSet[j]; + double threshold = 0.5*(max(bar.imgSize.width,bar.imgSize.height) + max(testObj.imgSize.width, testObj.imgSize.height)); + double dist = Utils::calPointDist(bar.centroid, testObj.centroid); + if (dist > threshold*0.6) + { + continue; + } + vector PtSet1, PtSet2; + bool yeah = _matcher->featureMatcher(curNo,testNo,PtSet1,PtSet2); + if (yeah) + { + _similarityMat(testNo,curNo) = PtSet1.size(); + _similarityMat(curNo,testNo) = PtSet1.size(); + + _matchNetList[curNo].relatedImgs.push_back(j); + _matchNetList[curNo].PointSet.push_back(PtSet1); + _matchNetList[testNo].relatedImgs.push_back(i); + _matchNetList[testNo].PointSet.push_back(PtSet2); + addedPairs ++; + } + } + + } + cout<<"-Done! added "< coreLocations; + int i, j, k; + //! in the order of '_visitOrser' + for (i = 0; i < _imgNum; i ++) + { + int imgNo = _visitOrder[i].imgNo; + double x0 = _imgSizeList[imgNo].width/2.0; + double y0 = _imgSizeList[imgNo].height/2.0; + Point2d centroid(x0, y0); + Point2d warpPt; + Utils::pointTransform(_alignModelList[i], centroid, warpPt); + coreLocations.push_back(warpPt); + } + int minX = 999, minY = 999, maxX = 0, maxY = 0; + for (i = 0; i < coreLocations.size(); i ++) + { + Point2d tmpPt = coreLocations[i]; + int x = int(fabs(tmpPt.x)+1)*(tmpPt.x < 0 ? -1 : 1); + int y = int(fabs(tmpPt.y)+1)*(tmpPt.y < 0 ? -1 : 1); + if (x > maxX) + maxX = x; + if (x < minX) + minX = x; + if (y > maxY) + maxY = y; + if (y < minY) + minY = y; + } + double width = maxX - minX; + double height = maxY - minY; + int imageRange = 2000; //maximum side_length + int edgeRange = 60; + double cvtScale = imageRange/min(height,width); + int imageRow = height * cvtScale + edgeRange*2; // add an edge space of 20 pixel + int imageCol = width * cvtScale + edgeRange*2; + Mat displayPlane(imageRow, imageCol, CV_8UC3, Scalar(255,255,255)); + + CvFont font; + double hScale = 1; + double vScale = 1; + cvInitFont(&font,CV_FONT_HERSHEY_PLAIN, hScale,vScale,0,1); //¶¨Òå±ê¼Ç×ÖÌå + vector dotPtList; + //! in the order of '_visitOrser' + for (i = 0; i < coreLocations.size(); i ++) + { + int c = int((coreLocations[i].x-minX) * cvtScale + 1) + edgeRange; + int r = int((coreLocations[i].y-minY) * cvtScale + 1) + edgeRange; + dotPtList.push_back(Point2i(c,r)); + circle(displayPlane, Point2i(c,r), 24, Scalar(255,0,0), -1); +// circle(displayPlane, Point2i(c,r), 3, Scalar(255,255,0), -1); + int imgNo = _visitOrder[i].imgNo; + char text[100]; + sprintf(text,"%d", imgNo); + Point2i dotPt(c+3, r+3); +// cv::putText(displayPlane, text, dotPt, 2, 1, Scalar(0,0,0)); + } + + for (i = 0; i < _imgNum-1; i ++) //draw all related lines + { + for (j = i+1; j < _imgNum; j ++) + { + int imgNo1 = _visitOrder[i].imgNo; + int imgNo2 = _visitOrder[j].imgNo; + int PtNum = _similarityMat(imgNo1,imgNo2); + if (PtNum != 0) + { + Point2i startPt = dotPtList[i]; + Point2i endPt = dotPtList[j]; + if (PtNum < 100 || 1) + { + line(displayPlane, startPt, endPt, Scalar(128,128,128), 2); + } + else + { + line(displayPlane, startPt, endPt, Scalar(0,255,0), 2); + } + } + } + } + for (i = 1; i < _imgNum; i ++) //! draw the related lines in MST + { + int refNo = _visitOrder[i].refNo; + int refIndex = findVisitIndex(refNo); + Point2i startPt = dotPtList[i]; + Point2i endPt = dotPtList[refIndex]; + line(displayPlane, startPt, endPt, Scalar(0,0,255), 3); + } + string savePath = Utils::baseDir + "/finalTopology.png"; + imwrite(savePath, displayPlane); + cout<<"#the topology graph of images is saved!"< coreLocations; + int i, j, k; + //! in the order of '_visitOrser' + for (i = 0; i < _imgNum; i ++) + { + int imgNo = _visitOrder[i].imgNo; + double x0 = _imgSizeList[imgNo].width/2.0; + double y0 = _imgSizeList[imgNo].height/2.0; + Point2d centroid(x0, y0); + Point2d warpPt; + Utils::pointTransform(_alignModelList[i], centroid, warpPt); + coreLocations.push_back(warpPt); + } + int minX = 999, minY = 999, maxX = 0, maxY = 0; + for (i = 0; i < coreLocations.size(); i ++) + { + Point2d tmpPt = coreLocations[i]; + int x = int(fabs(tmpPt.x)+1)*(tmpPt.x < 0 ? -1 : 1); + int y = int(fabs(tmpPt.y)+1)*(tmpPt.y < 0 ? -1 : 1); + if (x > maxX) + maxX = x; + if (x < minX) + minX = x; + if (y > maxY) + maxY = y; + if (y < minY) + minY = y; + } + double width = maxX - minX; + double height = maxY - minY; + int imageRange = 1000; //maximum side_length + int edgeRange = 50; + double cvtScale = imageRange/min(height,width); + int imageRow = height * cvtScale + edgeRange*2; // add an edge space of 20 pixel + int imageCol = width * cvtScale + edgeRange*2; + Mat displayPlane(imageRow, imageCol, CV_8UC3, Scalar(255,255,255)); + + CvFont font; + double hScale = 1; + double vScale = 1; + cvInitFont(&font,CV_FONT_HERSHEY_PLAIN, hScale,vScale,0,1); //¶¨Òå±ê¼Ç×ÖÌå + vector dotPtList; + //! label aligning group + for (i = 0; i < _groupCusorList.size(); i ++) + { + int sIndex = 0, eIndex = 0; + if (i != 0) + { + sIndex = _groupCusorList[i-1]+1; + eIndex = _groupCusorList[i]; + } + int r = rand()%255; + int g = rand()%255; + int b = rand()%255; + for (j = sIndex; j <= eIndex; j ++) + { + int c = int((coreLocations[j].x-minX) * cvtScale + 1) + edgeRange; + int r1 = int((coreLocations[j].y-minY) * cvtScale + 1) + edgeRange; + dotPtList.push_back(Point2i(c,r1)); + circle(displayPlane, Point2i(c,r1), 25, Scalar(r,g,b), -1); + int imgNo = _visitOrder[j].imgNo; + char text[100]; + sprintf(text,"%d", imgNo); + Point2i dotPt(c+3, r1+3); + cv::putText(displayPlane, text, dotPt, 2, 1, Scalar(0,0,0)); + } + } + + for (i = 0; i < _imgNum-1; i ++) //draw all related lines + { + for (j = i+1; j < _imgNum; j ++) + { + int imgNo1 = _visitOrder[i].imgNo; + int imgNo2 = _visitOrder[j].imgNo; + int PtNum = _similarityMat(imgNo1,imgNo2); + if (PtNum != 0) + { + Point2i startPt = dotPtList[i]; + Point2i endPt = dotPtList[j]; + if (PtNum < 100) + { + line(displayPlane, startPt, endPt, Scalar(128,128,128), 1); + } + else + { + line(displayPlane, startPt, endPt, Scalar(0,255,0), 1); + } + } + } + } + for (i = 1; i < _imgNum; i ++) //! draw the related lines in MST + { + int refNo = _visitOrder[i].refNo; + int refIndex = findVisitIndex(refNo); + Point2i startPt = dotPtList[i]; + Point2i endPt = dotPtList[refIndex]; + line(displayPlane, startPt, endPt, Scalar(0,0,255), 2); + } + string savePath = Utils::baseDir + "/groupLabel.jpg"; + imwrite(savePath, displayPlane); +} + + +void ImageAligner::drawSimilarMatrix() +{ + int margin = 50; + int imageRow = 800, imageCol = 800; + int unitSize = 800/_imgNum; + CvFont font; + double hScale = 1; + double vScale = 1; + cvInitFont(&font,CV_FONT_HERSHEY_PLAIN, hScale,vScale,0,1); //define the label font + Mat displayPlane(imageRow+2*margin, imageCol+2*margin, CV_8UC3, Scalar(0,0,0)); + for (int i = 0; i < _imgNum; i ++) + { + Point2i startPt_h(margin+i*unitSize, margin); //draw vertical lines + Point2i endPt_h(margin+i*unitSize, margin+unitSize*_imgNum); + line(displayPlane, startPt_h, endPt_h, Scalar(128,128,128), 1); + char text_h[100]; + sprintf(text_h,"%d", i+1); + Point2i dotPt1(startPt_h.x, startPt_h.y-10); //draw horizontal labels(the dot is at left-bottom of the label) + cv::putText(displayPlane, text_h, dotPt1, 1, 1, Scalar(255,255,255)); + + Point2i startPt_v(margin, margin+i*unitSize); //draw horizontal lines + Point2i endPt_v(margin+unitSize*_imgNum, margin+i*unitSize); + line(displayPlane, startPt_v, endPt_v, Scalar(128,128,128), 1); + char text_v[100]; + sprintf(text_v,"%d", i+1); + Point2i dotPt2(startPt_v.x-25, startPt_v.y+10); //draw vertical labels + cv::putText(displayPlane, text_v, dotPt2, 1, 1, Scalar(255,255,255)); + } + int* numDataPtr = (int*)_similarityMat.data; + int max_match_num = 0, min_match_num = 9999; + for (int i = 0; i < _imgNum-1; i ++) + { + for (int j = i+1; j < _imgNum; j ++) + { + int num = numDataPtr[i*_imgNum+j]; + if (num > max_match_num) + { + max_match_num = num; + } + if (num < min_match_num) + { + min_match_num = num; + } + } + } + double grayScale = (255-64+1)*1.0 / (max_match_num-min_match_num+1); + for (int i = 0; i < _imgNum-1; i ++) + { + for (int j = i+1; j < _imgNum; j ++) + { + Point2i leftTop, rigtBtm; + leftTop.x = margin + i*unitSize; + leftTop.y = margin + j*unitSize; + rigtBtm.x = leftTop.x + unitSize; + rigtBtm.y = leftTop.y + unitSize; + + int PtNum = _similarityMat(i,j); + if (PtNum == 0) + { + continue; + } + int grayValue = 64 + int((PtNum-min_match_num) * grayScale); + int r, c; + for (c = leftTop.x; c < rigtBtm.x; c ++) + { + for (r = leftTop.y; r < rigtBtm.y; r ++) + { + //! down triangle + displayPlane.at(r,c)[0] = grayValue; + displayPlane.at(r,c)[1] = grayValue; + displayPlane.at(r,c)[2] = grayValue; + //! up triangle + displayPlane.at(c,r)[0] = grayValue; + displayPlane.at(c,r)[1] = grayValue; + displayPlane.at(c,r)[2] = grayValue; + } + } + } + } + string savePath = Utils::baseDir + "/similarTable.jpg"; + imwrite(savePath, displayPlane); + cout<<"the similarity table of images is saved!"< deviations; + int cnt = 0; + for (int i = 1; i < _imgNum; i ++) + { + int curNo = _visitOrder[i].imgNo; + Match_Net matchNet = _matchNetList[curNo]; + vector relatedImgs = _matchNetList[curNo].relatedImgs; + Mat_ homoMat1 = _alignModelList[i]; + Mat_ homoMat2; + double curBias = 0; + int cnt1 = 0; + for (int j = 0; j < relatedImgs.size(); j ++) + { + int neigIndex = relatedImgs[j]; + if (neigIndex > i) + { + continue; + } + vector ptSet1, ptSet2; + ptSet1 = matchNet.PointSet[j]; //! points on cur_image + int neigNo = _visitOrder[neigIndex].imgNo; + Match_Net neigMatchNet = _matchNetList[neigNo]; + for (int k = 0; k < neigMatchNet.relatedImgs.size(); k ++) + { + if (neigMatchNet.relatedImgs[k] == i) + { + ptSet2 = neigMatchNet.PointSet[k]; + break; + } + } + homoMat2 = _alignModelList[neigIndex]; + //! using only one third of corresponding for optimization + for (int t = 0; t < ptSet1.size(); t += 3) + { + Point2d mosaicPt1 = Utils::pointTransform(homoMat1, ptSet1[t]); + Point2d mosaicPt2 = Utils::pointTransform(homoMat2, ptSet2[t]); + double bias = sqrt((mosaicPt1.x-mosaicPt2.x)*(mosaicPt1.x-mosaicPt2.x)+(mosaicPt1.y-mosaicPt2.y)*(mosaicPt1.y-mosaicPt2.y)); + + deviations.push_back(bias); + meanBias += bias; + cnt ++; + } + } + } + meanBias /= cnt; + + //! statistic the distribute of error + string savePath = Utils::baseDir + "/precise.txt"; + ofstream fout(savePath, ios::out); + if (!fout.is_open()) + { + cout<<"Save path not exists!"< homoMat = Mat::eye(3,3,CV_64FC1); + _alignModelList.push_back(homoMat); + } + double u0 = 500.971, v0 = 323.486; + Mat_ trans0 = (Mat_(3,3) << 1, 0, -u0, + 0, -1, 641-v0, + 0, 0, 1); + Mat_ trans1 = (Mat_(3,3) << 1, 0, u0, + 0, -1, -641+v0, + 0, 0, 1); + double kappa = 180; + Mat_ Rz = (Mat_(3,3) << cos(kappa), -sin(kappa), 0, + sin(kappa), cos(kappa), 0, + 0, 0, 1); + Mat_ t1 = (Mat_(3,3) << 1, 0, -u0, 0, 1, -v0, 0, 0, 1); + Mat_ t2 = (Mat_(3,3) << 1, 0, u0, 0, 1, v0, 0, 0, 1); + Mat_ bar = t2*Rz*t1; + for (int i = 0; i < _imgNum; i ++) + { + Mat_ homoMat = Mat::eye(3,3,CV_64FC1); + double* dataPtr = (double*)homoMat.data; + for (int j = 0; j < 8; j ++) + { + double param = 0; + fin >> param; + dataPtr[j] = param; + } + int curImgNo = i; + int curIndex = findVisitIndex(curImgNo); + if ((i/31)%2 == 0) //! rotate 180 + { + _alignModelList[curIndex] = trans1*homoMat*trans0; + } + else + { + _alignModelList[curIndex] = trans1*homoMat*trans0; + } + } + fin.close(); + cout<<"-Completed!"< +#include + +#define PENALTY_COEFF 0.10 //! set for LM only +#define Lambada 0.12 //! set for BA only +#define OPT_GROUP_NUM 30 +#define BKGRNDPIX 255 +#define Need_Mask 1 + +using namespace std; +using namespace cv; +using namespace Utils; + +struct Match_Net +{ + int imgNo; //! image no. start from 0 + vector relatedImgs; //! the position index of overlap-image in visitOrder + vector > PointSet; +}; + +struct LMData +{ + vector *matchPtr; + vector > *modelPtr; + vector visitOrder; + int sIndex; + int eIndex; +}; + +//-------------------------------------------------------------------- + +//! Notification : imgIndex/imgNo start from 0 + +class ImageAligner +{ +public: + ImageAligner(vector filePathList) + { + _filePathList = filePathList; + _imgNum = filePathList.size(); + _refImgNo = 0; + }; + ~ImageAligner(){}; + +public: + //*** functions for sorting the topological relationship of images ***// + void sortImageOrder(int referNo, bool shallLoad, bool isInorder); + void divideImageGroups(); + bool loadMatchPts(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2); + +public: + //*** functions for building and optimizing the alignment ***// + void imageStitcherbyGroup(int referNo); + void imageStitcherbySolos(int referNo); + void fillImageMatchNet(); + //! initial alignment by affine model + void solveGroupModels(int sIndex, int eIndex); + //! initial alignment by similarity transformation model + void solveGroupModelsS(int sIndex, int eIndex); + //! initial alignment by affine model + void solveSingleModel(int imgIndex); + int findVisitIndex(int imgNo); + //! alignment refinement to homographic model : LM Optimization + void RefineAligningModels(int sIndex, int eIndex); + void buildIniSolution(double* X, int sIndex, int eIndex); + static void OptimizationFunction(double* X, double* d, int m, int n, void* data); + //! alignment refinement to homographic model : Least Square Optimization + void bundleAdjustingA(int sIndex, int eIndex); //! method 1 : big matrix + void bundleAdjustinga(int sIndex, int eIndex); //! method 1 : normalize by point + void bundleAdjusting(int sIndex, int eIndex); //! method 2 : normalize by point + void buildIniSolution(double* X, double* initX, int sIndex, int eIndex); + + double CalWarpDeviation(vector pointSet1, vector pointSet2, Mat_ cvtMat, vector weightList); + //! detect potential overlapping relationships based on the new position (only used in the refinement) + void recheckTopology(int sIndex, int eIndex); + + //! display or output functions + Rect setImageSize(vector &nodePts); + void saveMosaicImage(); //! aligning in added order + void saveMosaicImageP(); //! aligning in image no. order + void outputPrecise(); + void loadHomographies(); + void saveModelParams(); + void drawTopologyNet(); + void labelGroupNodes(); + void drawSimilarMatrix(); + +private: + PointMatcher *_matcher; + Mat_ _similarityMat; + int _refImgNo; + int _imgNum; + int _alignedNum; + vector _groupCusorList; + vector _visitOrder; //! aligning order according this stack + vector _projCoordSet; //! same order with "_visitOrder" + vector _matchNetList; //! matching relation of each image (order agree with image no.) + vector > _alignModelList; //! aligning model parameters of each image (order agree with '_visitOrder') + vector > _initModelList; + + vector reliabilityList; //! record the mean square error of the initial affine model of each image + vector _filePathList; + vector _imgSizeList; //! order agree with image no. +}; diff --git a/ref/AutoStitching/source/Src/Mosaic/featureMatch.cpp b/ref/AutoStitching/source/Src/Mosaic/featureMatch.cpp new file mode 100644 index 0000000..3cae021 --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/featureMatch.cpp @@ -0,0 +1,484 @@ +#include "featureMatch.h" + +void PointMatcher::featureExtractor(bool extraPoints) +{ + int i, j; + if (!extraPoints) + { + for (i = 0; i < _imgNum; i ++) + { + int imgIndex = i; + char saveName[1024]; + sprintf(saveName, "Cache/keyPtfile/keys%d", imgIndex); + string saveName_ = Utils::baseDir + string(saveName); + _keysFileList.push_back(saveName_); + } + loadImgSizeList(); + return; + } + SurfFeatureDetector detector(400); + SurfDescriptorExtractor extractor; + for (i = 0; i < _imgNum; i ++) + { + string imgPath = _imgNameList[i]; + Mat image = imread(imgPath); + Size imgSize(image.cols, image.rows); + _imgSizeList.push_back(imgSize); + + vector keyPts; + Mat descriptors; + detector.detect(image, keyPts); + extractor.compute(image, keyPts, descriptors); + + int imgIndex = i; + char saveName[1024]; + sprintf(saveName, "Cache/keyPtfile/keys%d", imgIndex); + string saveName_ = Utils::baseDir + string(saveName); + _keysFileList.push_back(saveName_); + savefeatures(keyPts, descriptors, saveName_); + cout< keyPts, Mat descriptors, string saveName) +{ + FILE *fout; + fout = fopen(saveName.c_str(), "w"); + + int PtNum = keyPts.size(); + fprintf(fout, "%d\n", PtNum); + unsigned i, j; +// int n0 = 0, n1 = 0, n2 = 0, n3 = 0; + for (i = 0; i < PtNum; i ++) + { + Point2d point = keyPts[i].pt; + int octave = keyPts[i].octave; + fprintf(fout, "%.8lf %.8lf %d\n", point.x, point.y, octave); + //if (octave == 0) + //{ + // n0 ++; + //} + //else if (octave == 1) + //{ + // n1 ++; + //} + //else if (octave == 2) + //{ + // n2 ++; + //} + //else + //{ + // n3 ++; + //} + } + //int nn = n0+n1+n2+n3; + //cout<(i,j); + fprintf(fout, "%.8f ", temp); + } + fprintf(fout, "\n"); + } + fclose(fout); +} + + +void PointMatcher::readfeatures(int imgIndex, vector &keyPts, Mat &descriptors, double ratio) +{ + string fileName = _keysFileList[imgIndex]; + FILE *fin = fopen(fileName.c_str(), "r"); + int PtNum = 0; + fscanf(fin, "%d", &PtNum); + + int step = int(1/ratio); + int realNum = 0; + unsigned i, j; + for (i = 0; i < PtNum; i ++) + { + Point2d point; + int octave = 0; + fscanf(fin, "%lf%lf%d", &point.x, &point.y, &octave); + if (i%step == 0) + { + keyPts.push_back(point); + realNum++; + } + } + descriptors = Mat(realNum, featureDimension, CV_32FC1, Scalar(0)); + int cnt = 0; + for (i = 0; i < PtNum; i ++) //write feature descriptor data + { + if (i%step != 0) + { + for (j = 0; j < featureDimension; j ++) + { + float temp; + fscanf(fin, "%f", &temp); + } + } + else + { + for (j = 0; j < featureDimension; j ++) + { + float temp; + fscanf(fin, "%f", &temp); + descriptors.at(cnt,j) = temp; + } + cnt++; + } + } + fclose(fin); +} + + +void PointMatcher::loadImgSizeList() +{ + string filePath = Utils::baseDir + "Cache/imgSizeList.txt"; + FILE *fin = fopen(filePath.c_str(), "r"); + if (fin == nullptr) + { + cout<<"No image size file!\n"; + return; + } + for (int i = 0; i < _imgNum; i ++) + { + int width, height; + fscanf(fin, "%d %d\n", &width, &height); + _imgSizeList.push_back(Size(width,height)); + } + fclose(fin); +} + + +void PointMatcher::saveImgSizeList() +{ + string savePath = Utils::baseDir + "Cache/imgSizeList.txt"; + FILE *fout = fopen(savePath.c_str(), "w"); + for (int i = 0; i < _imgNum; i ++) + { + int width = _imgSizeList[i].width, height = _imgSizeList[i].height; + fprintf(fout, "%d %d\n", width, height); + } + fclose(fout); +} + + +bool PointMatcher::featureMatcher(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2) +{ + pointSet1.clear(); + pointSet2.clear(); + vector keyPts1, keyPts2; + Mat descriptors1, descriptors2; + readfeatures(imgIndex1, keyPts1, descriptors1, 1.0); + readfeatures(imgIndex2, keyPts2, descriptors2, 1.0); + + // Matching descriptor vectors using FLANN matcher + vector m_Matches; + FlannBasedMatcher matcher; + vector> knnmatches; + int num1 = keyPts1.size(), num2 = keyPts2.size(); + int kn = min(min(num1, num2), 5); + matcher.knnMatch(descriptors1, descriptors2, knnmatches, kn); + int i, j; + double minimaDsit = 99999; + for (i = 0; i < knnmatches.size(); i ++) + { + double dist = knnmatches[i][1].distance; + if (dist < minimaDsit) + { + minimaDsit = dist; + } + } + double fitedThreshold = minimaDsit * 5; + int keypointsize = knnmatches.size(); + for (i = 0; i < keypointsize; i ++) + { + const DMatch nearDist1 = knnmatches[i][0]; + const DMatch nearDist2 = knnmatches[i][1]; + double distanceRatio = nearDist1.distance / nearDist2.distance; + if (nearDist1.distance < fitedThreshold && distanceRatio < 0.7) + { + m_Matches.push_back(nearDist1); + } + } + + vector iniPts1, iniPts2; + for (i = 0; i < m_Matches.size(); i ++) //get initial match pairs + { + int queryIndex = m_Matches[i].queryIdx; + int trainIndex = m_Matches[i].trainIdx; + Point2d tempPt1 = keyPts1[queryIndex]; + Point2d tempPt2 = keyPts2[trainIndex]; + iniPts1.push_back(tempPt1); + iniPts2.push_back(tempPt2); + } + if (iniPts1.size() < 10) + { + return false; + } + + vector status; + //! utilize epi-polar geometry constraints to delete missing matches + Mat Fmatrix = findFundamentalMat(iniPts1, iniPts2, CV_RANSAC, 1.5, 0.99, status); + for (i = 0; i < status.size(); i ++) + { + if (status[i] == 1) + { + pointSet1.push_back(iniPts1[i]); + pointSet2.push_back(iniPts2[i]); + } + } + if (pointSet1.size() < 10) + { + return false; + } + + Mat homoMat = findHomography(iniPts2, iniPts1, CV_RANSAC, 2.5); //! Pt1 = homoMat*Pt2 + vector goodPts1, goodPts2; + for (i = 0; i < pointSet1.size(); i ++) //mean value + { + Point2d warpedPt; + Utils::pointTransform(homoMat, pointSet2[i], warpedPt); + double dist = 0; + dist = sqrt((warpedPt.x-pointSet1[i].x)*(warpedPt.x-pointSet1[i].x) + (warpedPt.y-pointSet1[i].y)*(warpedPt.y-pointSet1[i].y)); + if (dist < 3.0) + { + goodPts1.push_back(pointSet1[i]); + goodPts2.push_back(pointSet2[i]); + } + } + pointSet1 = goodPts1; + pointSet2 = goodPts2; + if (pointSet1.size() < 10) //! modify as 20 + { + return false; + } +// cout<<"Image "< set1, set2; + //for (int i = 0; i < pointSet1.size(); i += step) + //{ + // set1.push_back(pointSet1[i]); + // set2.push_back(pointSet2[i]); + //} + //saveMatchPts(imgIndex1, imgIndex2, set1, set2); + //drawMatches(imgIndex1, imgIndex2, set1, set2); + saveMatchPts(imgIndex1, imgIndex2, pointSet1, pointSet2); +// drawMatches(imgIndex1, imgIndex2, pointSet1, pointSet2); + return true; +} + + +void PointMatcher::saveMatchPts(int imgIndex1, int imgIndex2, vector pointSet1, vector pointSet2) +{ + bool exchanged = false; + if (imgIndex1 > imgIndex2) //set a consistent standard: smaller index in the left + { + int temp = imgIndex2; + imgIndex2 = imgIndex1; + imgIndex1 = temp; + exchanged = true; + } + char saveName[1024]; + sprintf(saveName, "Cache/matchPtfile/match%d&%d.txt", imgIndex1, imgIndex2); + string savePath = Utils::baseDir + string(saveName); + FILE *fout = fopen(savePath.c_str(), "w"); + int PtNum = pointSet1.size(); + fprintf(fout, "%d\n", PtNum); + if (!exchanged) + { + for (int i = 0; i < PtNum; i ++) + { + double x1 = pointSet1[i].x, y1 = pointSet1[i].y; + double x2 = pointSet2[i].x, y2 = pointSet2[i].y; + fprintf(fout, "%lf %lf %lf %lf\n", x1, y1, x2, y2); + } + } + else + { + for (int i = 0; i < PtNum; i ++) + { + double x1 = pointSet1[i].x, y1 = pointSet1[i].y; + double x2 = pointSet2[i].x, y2 = pointSet2[i].y; + fprintf(fout, "%lf %lf %lf %lf\n", x2, y2, x1, y1); + } + } + fclose(fout); +// cout<<"Matched Points of image "< &pointSet1, vector &pointSet2) +{ + bool exchanged = false; + if (imgIndex1 > imgIndex2) //set a consistent standard: smaller index in the left + { + int temp = imgIndex2; + imgIndex2 = imgIndex1; + imgIndex1 = temp; + exchanged = true; + } + char fileName[1024]; + sprintf(fileName, "Cache/matchPtfile/match%d&%d.txt", imgIndex1, imgIndex2); + string filePath = Utils::baseDir + string(fileName); + FILE *fin = fopen(filePath.c_str(), "r"); + if (fin == nullptr) + { + cout<<"invalid matching file of image "< keyPts1, keyPts2; + Mat descriptors1, descriptors2; + readfeatures(imgIndex1, keyPts1, descriptors1, 0.3); + readfeatures(imgIndex2, keyPts2, descriptors2, 0.3); + + // Matching descriptor vectors using FLANN matcher + vector m_Matches; + FlannBasedMatcher matcher; + vector> knnmatches; + int num1 = keyPts1.size(), num2 = keyPts2.size(); + int kn = min(min(num1, num2), 5); + matcher.knnMatch(descriptors1, descriptors2, knnmatches, kn); + int i, j; + double minimaDsit = 99999; + for (i = 0; i < knnmatches.size(); i ++) + { + double dist = knnmatches[i][0].distance; + if (dist < minimaDsit) + { + minimaDsit = dist; + } + } + double fitedThreshold = minimaDsit * 5; + int keypointsize = knnmatches.size(); + for (i = 0; i < keypointsize; i ++) + { + const DMatch nearDist1 = knnmatches[i][0]; + const DMatch nearDist2 = knnmatches[i][1]; + double distanceRatio = nearDist1.distance / nearDist2.distance; + if (nearDist1.distance < fitedThreshold && distanceRatio < 0.7) + { + m_Matches.push_back(nearDist1); + } + } + vector iniPts1, iniPts2; + for (i = 0; i < m_Matches.size(); i ++) //get initial match pairs + { + int queryIndex = m_Matches[i].queryIdx; + int trainIndex = m_Matches[i].trainIdx; + Point2d tempPt1 = keyPts1[queryIndex]; + Point2d tempPt2 = keyPts2[trainIndex]; + iniPts1.push_back(tempPt1); + iniPts2.push_back(tempPt2); + } + if (iniPts1.size() < 15) + { + return false; + } + Mat_ homoMat = findHomography(iniPts1, iniPts2, CV_RANSAC, 5.0); //initial solution : from image2 to image1 + vector goodPts1, goodPts2; + for (i = 0; i < iniPts1.size(); i ++) //mean value + { + Point2d warpedPt; + pointConvert(homoMat, iniPts2[i], warpedPt); + double dist = 0; + dist = sqrt((warpedPt.x-iniPts1[i].x)*(warpedPt.x-iniPts1[i].x) + (warpedPt.y-iniPts1[i].y)*(warpedPt.y-iniPts1[i].y)); + if (dist < 5.0) + { + goodPts1.push_back(iniPts1[i]); + goodPts2.push_back(iniPts2[i]); + } + } + if (goodPts1.size() < 5) + { + return false; + } + + return true; +} + + +void PointMatcher::pointConvert(Mat_ homoMat, Point2d src, Point2d &dst) +{ + Mat_ srcX = (Mat_(3,1)<< src.x, src.y, 1); + Mat_ dstX = homoMat * srcX; + dst = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2)); +} + + +void PointMatcher::drawMatches(int imgIndex1, int imgIndex2, vector pointSet1, vector pointSet2) +{ + int i, j; + string fileName1 = _imgNameList[imgIndex1]; + string fileName2 = _imgNameList[imgIndex2]; + Mat image1 = imread(fileName1); + Mat image2 = imread(fileName2); + int w = 8; + CvFont font; + double hScale = 1; + double vScale = 1; + cvInitFont(&font,CV_FONT_HERSHEY_PLAIN, hScale,vScale,0,1); // + for (i = 0; i < pointSet1.size(); i ++) + { + Point2d tempPt1 = pointSet1[i]; + circle(image1, tempPt1, 3, Scalar(0,0,255), -1); + + Point2d tempPt2 = pointSet2[i]; + circle(image2, tempPt2, 3, Scalar(0,0,255), -1); + +/* char text[100]; + sprintf(text,"%d", i); + Point2d dotPt(3, 3); + cv::putText(image1, text, tempPt1+dotPt, 2, 1, Scalar(0,0,0)); + cv::putText(image2, text, tempPt2+dotPt, 2, 1, Scalar(0,0,0));*/ + line(image1, tempPt1, tempPt2, Scalar(0,255,0), 1); + line(image2, tempPt2, tempPt1, Scalar(0,255,0), 1); + } + char name1[512], name2[512]; + static int no = 0; + sprintf(name1, "match%d_0.jpg", no); + sprintf(name2, "match%d_1.jpg", no); + no ++; + string filePath1 = Utils::baseDir + "Cache/match_map/" + string(name1); + string filePath2 = Utils::baseDir + "Cache/match_map/" + string(name2); + imwrite(filePath1, image1); + imwrite(filePath2, image2); +} \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Mosaic/featureMatch.h b/ref/AutoStitching/source/Src/Mosaic/featureMatch.h new file mode 100644 index 0000000..08c0f5f --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/featureMatch.h @@ -0,0 +1,53 @@ +#pragma once +#include "Utils/util.h" +#include +#include +#include +#include +#include +#include +#include "opencv2/nonfree/nonfree.hpp" + +using namespace std; +using namespace cv; + +// ============== NOTIFICATION =============== // +//! image no. is encoded from 0, 2, ..., n-1. // +//! // +// =========================================== // + +class PointMatcher +{ +public: + PointMatcher(vector imgNameList, bool extraPoints) + { + featureDimension = 64; + _imgNameList = imgNameList; + _imgNum = imgNameList.size(); + featureExtractor(extraPoints); + }; + +public: + void featureExtractor(bool extraPoints); + void readfeatures(int imgIndex, vector &keyPts, Mat &descriptors, double ratio); + void savefeatures(vector keyPts, Mat descriptors, string saveName); + void loadImgSizeList(); + void saveImgSizeList(); + + bool tentativeMatcher(int imgIndex1, int imgIndex2); + bool featureMatcher(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2); //! all the imgIndex start from 1 + void saveMatchPts(int imgIndex1, int imgIndex2, vector pointSet1, vector pointSet2); + bool loadMatchPts(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2); + + void pointConvert(Mat_ homoMat, Point2d src, Point2d &dst); + void drawMatches(int imgIndex1, int imgIndex2, vector pointSet1, vector pointSet2); + +public: + vector _imgSizeList; + vector _imgNameList; + +private: + int _imgNum; + int featureDimension; + vector _keysFileList; +}; \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Mosaic/graphPro.cpp b/ref/AutoStitching/source/Src/Mosaic/graphPro.cpp new file mode 100644 index 0000000..7047327 --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/graphPro.cpp @@ -0,0 +1,335 @@ +#include "graphPro.h" +#define MAX_COST 9999 + +vector Graph::DijkstraForPath(Mat_ graph, int rootNo) //rootNoʾԴ +{ + int nodeNum = graph.rows; + Mat_ dist = Mat(1, nodeNum, CV_64FC1, Scalar(0)); + Mat_ path = Mat(1, nodeNum, CV_16UC1, Scalar(0)); + bool *visited = new bool[nodeNum]; + for(int i = 0; i < nodeNum; i ++) //ʼ + { + if(graph(rootNo,i) > 0 && i != rootNo) + { + dist(i) = graph(rootNo,i); + path(i) = rootNo; //path¼·ϴrootNoiǰһ + } + else + { + dist(i) = MAX_COST; //irootNoֱڣȨֵΪ + path(i) = -1; + } + visited[i] = false; + path(rootNo) = rootNo; + dist(rootNo) = 0; + } + visited[rootNo] = true; + for(int i = 1; i < nodeNum; i ++) //ѭչn-1 + { + int min = MAX_COST; + int u; + for(int j = 0; j < nodeNum; j ++) //ѰδչȨֵСĶ + { + if(visited[j] == false && dist(j) < min) + { + min = dist(j); + u = j; + } + } + visited[u] = true; + for(int k = 0; k < nodeNum; k ++) //distֵ·ֵ + { + if(visited[k] == false && graph(u,k) > 0 && + min + graph(u,k) < dist(k)) + { + dist(k) = min + graph(u,k); + path(k) = u; + } + } + } + delete []visited; + path(rootNo) = -1; //! set the parent of root node as -1 + return traverseBreadthFirst(path, rootNo); +} + + +vector Graph::FloydForPath(Mat_ graph) +{ + int nodeNum = graph.rows; + //! initialize for dist and path + Mat_ dist = Mat(nodeNum, nodeNum, CV_64FC1, Scalar(0)); + Mat_ path = Mat(nodeNum, nodeNum, CV_16UC1, Scalar(0)); + double *graphPtr = (double*)graph.data; + double *distPtr = (double*)dist.data; + int *pathPtr = (int*)path.data; + for(int i = 0; i < nodeNum; i ++) + { + for(int j = 0; j < nodeNum; j ++) + { + if(graph(i,j) > 0) + { + //dist(i,j) = graph(i,j); + //path(i,j) = i; + distPtr[i*nodeNum+j] = graphPtr[i*nodeNum+j]; + pathPtr[i*nodeNum+j] = i; + } + else + { + if(i != j) + { + //dist(i,j) = MAX_COST; + //path(i,j) = -1; + distPtr[i*nodeNum+j] = MAX_COST; + pathPtr[i*nodeNum+j] = -1; + } + else + { + //dist(i,j) = 0; + //path(i,j) = i; + distPtr[i*nodeNum+j] = 0; + pathPtr[i*nodeNum+j] = i; + } + } + } + } + //! perform Floyd algorithm + for(int k = 0; k < nodeNum; k ++) //м(עkΪʲôֻ) + { + for(int i = 0; i < nodeNum; i ++) + { + for(int j = 0; j < nodeNum; j ++) + { + //if(dist(i,k) + dist(k,j) < dist(i,j)) + //{ + // dist(i,j) = dist(i,k) + dist(k,j); + // path(i,j) = path(k,j); //path[i][j]¼ij·jǰһ + //} + if (distPtr[i*nodeNum+k] + distPtr[k*nodeNum+j] < distPtr[i*nodeNum+j]) + { + distPtr[i*nodeNum+j] = distPtr[i*nodeNum+k] + distPtr[k*nodeNum+j]; + pathPtr[i*nodeNum+j] = pathPtr[k*nodeNum+j]; + } + } + } + } + + //! find optimal root node + double leastDist = 9999; + int rootNo = 0; + FILE *fp = fopen("E:/costs.txt", "w"); + for (int i = 0; i < nodeNum; i ++) + { + double distSum = 0; + for (int j = 0; j < nodeNum; j ++) + { + distSum += dist(i,j); + } + fprintf(fp, "%lf\n", distSum); + if (distSum < leastDist) + { + leastDist = distSum; + rootNo = i; + } + } + fclose(fp); +// appendix(dist, rootNo); + path.row(rootNo)(rootNo) = -1; //! set the parent of root node as -1 + return traverseBreadthFirst(path.row(rootNo), rootNo); +} + + +Mat_ Graph::extractMSTree(Mat_ graph) +{ + int vNum = graph.rows; + Mat_ edgeList = Mat(vNum-1, 2, CV_32SC1); + vector lowcost(vNum,0); + vector adjecent(vNum,0); + vector s(vNum); //! label the nodes + double *dataPtr = (double*)graph.data; + for (int i = 0; i < vNum*vNum; i ++) + { + if (dataPtr[i] < 0) //! infinite : -1, so convert back as infinite(MAX_COST) + { + dataPtr[i] = MAX_COST; + } + } + s[0] = true; + for (int i = 1; i < vNum; ++ i) + { + lowcost[i] = graph(0,i); + adjecent[i] = 0; + s[i] = false; + } + + //! searching the minimum spanning tree + for (int i = 0; i < vNum-1; ++i) //! for other n-1 nodes + { + double min = MAX_COST; + int j = 0; //! new node to be added + for (int k = 1; k < vNum; ++k) + { + if (lowcost[k] < min && !s[k]) + { + min = lowcost[k]; + j = k; + } + } +// cout <<"Joint"< Graph::traverseBreadthFirst(Mat_ path, int rootNo) +{ + int nodeNum = path.cols; + vector visitOrder; + TreeNode bar(rootNo,-1,0); + visitOrder.push_back(bar); + vector headList; + headList.push_back(rootNo); + vector headers, nheaders; + headers.push_back(rootNo); + int level = 1; + //! T(n) = O(n^2) + while (1) + { + //! searching by levels of tree + for (int t = 0; t < headers.size(); t ++) + { + int headNo = headers[t]; + //! the index of node is its node no + for (int i = 0; i < nodeNum; i ++) + { + if (path(i) == headNo) //! judge parent node + { + nheaders.push_back(i); + TreeNode bar(i, headNo, level); + visitOrder.push_back(bar); + } + } + } + if (visitOrder.size() == nodeNum) + { + break; + } + + level ++; + headers = nheaders; + nheaders.clear(); + } + + return visitOrder; +} + + +void Graph::appendix(Mat_ dist, int root) +{ + int num = dist.rows; + double maxVal = 0, minVal = 999; + for (int i = 0; i < num-1; i ++) + { + for (int j = i+1; j < num; j ++) + { + if (maxVal < dist(i,j)) + { + maxVal = dist(i,j); + } + if (minVal > dist(i,j)) + { + minVal = dist(i,j); + } + } + } + minVal = 0.0; + cout<(y,x) = grayValue; + } + } + } + } + int gap = 30; + //! legend + for (int i = 0; i < num; i ++) + { + int grayValue = int(i*255.0/num); + int x0 = unit*num + gap; + int y0 = unit*(num-i-1); + //! draw block + for (int x = x0; x <= x0+unit*4; x ++) + { + for (int y = y0; y <= y0+unit; y ++) + { + board.at(y,x) = grayValue; + } + } + } + int x0 = unit*45; + int y0 = unit*num + gap; + //! draw block + for (int x = x0; x <= x0+unit; x ++) + { + for (int y = y0; y <= y0+unit*2; y ++) + { + board.at(y,x) = 25; + } + } + for (int i = 0; i < num; i ++) + { + double sumrow = 0; + for (int j = 0; j < num; j ++) + { + double val = dist(i,j); + sumrow += val; + } + sumrow /= num; + if (i == 0 || i == root) + { + cout< "<(y,x) = grayValue; + } + } + } + imwrite("E:/gray.jpg", board); + Mat colorMap = Utils::grayToPesudoColor(board); + imwrite("E:/color.jpg", colorMap); +} \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Mosaic/graphPro.h b/ref/AutoStitching/source/Src/Mosaic/graphPro.h new file mode 100644 index 0000000..2dac3cf --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/graphPro.h @@ -0,0 +1,38 @@ +#pragma once +#include "Utils/util.h" +#include +#include +#include +#include +#include "opencv2/nonfree/nonfree.hpp" + +using namespace std; +using namespace cv; +using namespace Utils; + +// ===================== NOTIFICATION ====================== // +//! node is encoded from 0, 2, ..., n-1. // +//! cost graph: all cost must be a positive value, and cost // +//! of the non-overlap pair is specially set as -1. // +// ========================================================= // + +class Graph +{ +public: + Graph() + { + + }; + ~Graph(){}; + + //! single-source shortest path algorithm + static vector DijkstraForPath(Mat_ graph, int rootNo); + //! shortest path algorithm for all node pairs + static vector FloydForPath(Mat_ graph); + //! minimum spanning tree + static Mat_ extractMSTree(Mat_ graph); + + //! tool functions + static vector traverseBreadthFirst(Mat_ path, int rootNo); + static void appendix(Mat_ dist, int root); +}; \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Mosaic/main.cpp b/ref/AutoStitching/source/Src/Mosaic/main.cpp new file mode 100644 index 0000000..546a147 --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/main.cpp @@ -0,0 +1,75 @@ +#include "featureMatch.h" +#include "alignment.h" +#include "Utils/util.h" +#include +#include +#include +#include + +using namespace std; + +void DOMCheckbyRigid(); + +void main() +{ + clock_t start_time, end_time; + start_time = clock(); + + string imagePath = Utils::baseDir + "Images/classic1"; + vector imgPathList = Utils::get_filelist(imagePath); +// for (int i = 0; i < imgPathList.size(); i ++) +// { +// if ((i%31)%2 != 0) +// { +// continue; +// } +// Mat img = imread(imgPathList[i]); +//// cout< pts1, pts2; + Utils::loadMatchPts(0, 1, pts1, pts2); + Mat_ A = Mat(2*21, 4, CV_64FC1, Scalar(0)); + Mat_ L = Mat(2*21, 1, CV_64FC1, Scalar(0)); + for (int k = 0; k < pts1.size(); k ++) + { + int rn = k; + Point2d pt1 = pts2[k], pt2 = pts1[k]; + A(2*rn,0) = pt1.x; A(2*rn,1) = -pt1.y; A(2*rn,2) = 1; + A(2*rn+1,0) = pt1.y; A(2*rn+1,1) = pt1.x; A(2*rn+1,3) = 1; + L(2*rn) = pt2.x; + L(2*rn+1) = pt2.y; + } + Mat_ X = (A.t()*A).inv()*(A.t()*L); + Mat_ simiModel = (Mat_(3,3) << X(0) , -X(1), X(2), + X(1), X(0), X(3), + 0, 0, 1); + FILE *fp = fopen("E:/adf.txt", "w"); + for (int k = 0; k < pts2.size(); k ++) + { + Point2d tar = Utils::pointTransform(simiModel, pts2[k]); + fprintf(fp, "%lf %lf\n", tar.x, tar.y); + } + fclose(fp); + return; +} diff --git a/ref/AutoStitching/source/Src/Mosaic/topology.cpp b/ref/AutoStitching/source/Src/Mosaic/topology.cpp new file mode 100644 index 0000000..146215c --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/topology.cpp @@ -0,0 +1,1109 @@ +#include "topology.h" +#define BKGRNDPIX 0 + +Mat_ TopoFinder::findTopology(bool shallLoad, bool isInOrder) +{ + _isInOrder = isInOrder; + if (shallLoad) + { + //! load similarity matrix from disk + return loadSimilarityMat(); + } + loadKeyFiles(); + clock_t start_time, end_time; + start_time = clock(); + cout<<"Building similarity table ...\n"; + Mat_ similarMat = detectSimilarityByGuiding(); + // Mat_ similarMat = detectSimilarityOnGlobal(); + end_time = clock(); + _totalTime = 1000*(end_time-start_time)/CLOCKS_PER_SEC; //! ms + //! write out + string savePath = Utils::baseDir + "topoInfor.txt"; + ofstream fout; + fout.open(savePath.c_str(), ios::out); + fout<<_shotNum<<" in "<<_attempNum< TopoFinder::detectSimilarityOnGlobal() +{ + Mat_ similarMat = Mat(_imgNum, _imgNum, CV_32SC1, Scalar(0)); + for (int i = 0; i < _imgNum-1; i ++) + { + for (int j = i+1; j < _imgNum; j ++) + { + _attempNum ++; + vector pointSet1, pointSet2; +// Utils::loadMatchPts(i,j,pointSet1,pointSet2); + if (featureMatcher(i,j,pointSet1,pointSet2)) + { + similarMat(i,j) = pointSet1.size(); + similarMat(j,i) = pointSet1.size(); + _shotNum ++; + } + } + } + return similarMat; +} + + +Mat_ TopoFinder::detectSimilarityByGuiding() +{ + bool isTimeConsecutive = _isInOrder; + _similarityMat = Mat(_imgNum, _imgNum, CV_32SC1, Scalar(0)); + _attempMap = Mat::eye(_imgNum, _imgNum, CV_16UC1); + //! find and match main chain, meanwhile edit the similarity table + if (isTimeConsecutive) + { + buildMainChain(); + } + else + { + searchMainChain(); + } + //! solve the aligning models of each image + Mat_ identMatrix = Mat::eye(3,3,CV_64FC1); + _affineMatList.push_back(identMatrix); + Quadra bar; + bar.imgSize = _Ptmatcher->_imgSizeList[_visitOrder0[0].imgNo]; + bar.centroid = Point2d(bar.imgSize.width/2, bar.imgSize.height/2); + _projCoordSet.push_back(bar); + cout<<"Detecting potential overlaps ..."< pointSet1, pointSet2; + clock_t st, et; + st = clock(); + Utils::loadMatchPts(refNo, curNo, pointSet1, pointSet2); + et = clock(); + _matchTime -= (et-st); + Utils::pointTransform(_affineMatList[refIndex], pointSet1); + //! perform initial alignment + Mat_ affineMat = findFastAffine(pointSet1, pointSet2); + _affineMatList.push_back(affineMat); + //! record centroid of current image + Quadra bar; + bar.imgSize = _Ptmatcher->_imgSizeList[curNo]; + Point2d centroid(bar.imgSize.width/2.0, bar.imgSize.height/2.0); + bar.centroid = Utils::pointTransform(affineMat, centroid); + _projCoordSet.push_back(bar); + + //! detect potential overlaps + //! 1) recalculate aligning model; 2) modify centroid; 3) modify similarity table + detectPotentialOverlap(i, pointSet1, pointSet2); + cout<<"-->end!"< TopoFinder::getGuidingTable() +{ + cout<<"Initializing ..."< guidingTable = Mat(_imgNum, _imgNum, CV_64FC1, Scalar(0)); + Mat_ simiMat = Mat(_imgNum, _imgNum, CV_32SC1, Scalar(0)); + for (int i = 0; i < _imgNum-1; i ++) + { + for (int j = i+1; j < _imgNum; j ++) + { + int num = calSimilarNum(i,j); + simiMat(i,j) = num; + simiMat(j,i) = num; + double cost = 6/log(num+50.0); + if (num == 0) + { + cost = -1; + } + guidingTable(i,j) = cost; + guidingTable(j,i) = cost; + } + } + saveSimilarityMat(simiMat); + cout<<"Done!"< TopoFinder::getGuidingTableP() +{ + cout<<"Initializing ..."< guidingTable = Mat(_imgNum, _imgNum, CV_64FC1, Scalar(0)); + Mat_ simiMat = Mat(_imgNum, _imgNum, CV_32SC1, Scalar(0)); + int step = max(1,(_imgNum-1)*_imgNum/20); //! 10% + int n = 0; + for (int i = 0; i < _imgNum-1; i ++) + { + for (int j = i+1; j < _imgNum; j ++) + { + int num = calSimilarNum(i,j); + simiMat(i,j) = num; + simiMat(j,i) = num; + double cost = 6/log(num+50.0); + if (num == 0) + { + cost = -1; + } + guidingTable(i,j) = cost; + guidingTable(j,i) = cost; + n ++; + if (n%step == 0) + { + cout<<10*n/step<<"% "; + } + } + } + cout< pointSet1, pointSet2; + if (Load_Matches) + { + Utils::loadMatchPts(no1, no1+1, pointSet1, pointSet2); + } + else + { + clock_t st, et; + st = clock(); + if (!featureMatcher(no1, no1+1, pointSet1, pointSet2)) + { + cout< 0) + { + _visitOrder0.push_back(TreeNode(no1-1,no1,0)); + if (Load_Matches) + { + Utils::loadMatchPts(no1-1, no1, pointSet1, pointSet2); + } + else + { + clock_t st, et; + st = clock(); + if (!featureMatcher(no1-1, no1, pointSet1, pointSet2)) + { + cout< guidingTable = getGuidingTableP(); + int iter = 0, maxIter = max(int(_imgNum*0.2), 20); + while (1) + { + cout<<"Searching main chain ... (attempt: "<<++iter<<")"< imgPairs= Graph::extractMSTree(guidingTable); + int pairNo = 0; + for (pairNo = 0; pairNo < imgPairs.rows; pairNo ++) + { + int no1 = imgPairs(pairNo,0), no2 = imgPairs(pairNo,1); + //! avoiding repeating matching which is done in last iteration + if (_attempMap(no1,no2) != 0) + { + continue; + } + _attempMap(no1,no2) = 1; + _attempMap(no2,no1) = 1; + vector pointSet1, pointSet2; + _attempNum ++; + + clock_t st, et; + st = clock(); + bool yeah = featureMatcher(no1,no2,pointSet1,pointSet2); + et = clock(); + _matchTime += (et-st); + if (yeah) + { + _shotNum ++; + _similarityMat(no1,no2) = pointSet1.size(); + _similarityMat(no2,no1) = pointSet1.size(); + guidingTable(no1,no2) = 0.0; + guidingTable(no2,no1) = 0.0; + } + else + { + //! matching failed : cost as infinite + guidingTable(no1,no2) = 999; + guidingTable(no2,no1) = 999; + if (iter == maxIter) + { + cout<<"Poor image sequence! exit out."< costGraph = Utils::buildCostGraph(_similarityMat); + _visitOrder0 = Graph::FloydForPath(costGraph); +} + + +void TopoFinder::detectPotentialOverlap(int curIndex, vector &pointSet1, vector &pointSet2) +{ + int curRefNo = _visitOrder0[curIndex].refNo; + int curNo = _visitOrder0[curIndex].imgNo; + Point2d iniPos = _projCoordSet[curIndex].centroid; + int width = _projCoordSet[curIndex].imgSize.width; + int height = _projCoordSet[curIndex].imgSize.height; + //! accelerate : build a KD-tree for all centroids and retrieve + bool isGot = false; + for (int i = 0; i < _projCoordSet.size(); i ++) + { + int testNo = _visitOrder0[i].imgNo; + if (_attempMap(curNo,testNo)) + { + continue; + } + Quadra testObj = _projCoordSet[i]; + double threshold = 0.5*(max(width,height) + max(testObj.imgSize.width, testObj.imgSize.height)); + double dist = Utils::calPointDist(iniPos, testObj.centroid); + if (dist > threshold*0.8) + { + continue; + } + _attempNum ++; + vector newPtSet1, newPtSet2; + //! for debug test + if (Load_Matches) + { + if (Utils::loadMatchPts(testNo,curNo,newPtSet1,newPtSet2)) + { + _similarityMat(testNo,curNo) = newPtSet1.size(); + _similarityMat(curNo,testNo) = newPtSet1.size(); + Utils::pointTransform(_affineMatList[i], newPtSet1); + for (int t = 0; t < newPtSet1.size(); t ++) + { + pointSet1.push_back(newPtSet1[t]); + pointSet2.push_back(newPtSet2[t]); + } + _shotNum ++; + isGot = true; + } + } + else + { + if (dist < threshold*0.8) + { + clock_t st, et; + st = clock(); + bool yeah = featureMatcher(testNo,curNo,newPtSet1,newPtSet2); + et = clock(); + _matchTime += (et-st); + if (yeah) + { + _similarityMat(testNo,curNo) = newPtSet1.size(); + _similarityMat(curNo,testNo) = newPtSet1.size(); + Utils::pointTransform(_affineMatList[i], newPtSet1); + for (int t = 0; t < newPtSet1.size(); t ++) + { + pointSet1.push_back(newPtSet1[t]); + pointSet2.push_back(newPtSet2[t]); + } + _shotNum ++; + isGot = true; + } + } + //else + //{ + // if (_Ptmatcher->tentativeMatcher(testNo,curNo)) + // { + // clock_t st, et; + // st = clock(); + // bool yeah = _Ptmatcher->featureMatcher(testNo,curNo,newPtSet1,newPtSet2); + // et = clock(); + // _matchTime += (et-st); + // _similarityMat(testNo,curNo) = newPtSet1.size(); + // _similarityMat(curNo,testNo) = newPtSet1.size(); + // Utils::pointTransform(_affineMatList[i], newPtSet1); + // for (int t = 0; t < newPtSet1.size(); t ++) + // { + // pointSet1.push_back(newPtSet1[t]); + // pointSet2.push_back(newPtSet2[t]); + // } + // _shotNum ++; + // isGot = true; + // } + //} + } + } + if (!isGot) + { + return; + } + //! modify the affine model parameter + _affineMatList[curIndex] = findFastAffine(pointSet1, pointSet2); + //! modify the centroid + _projCoordSet[curIndex].centroid = Utils::pointTransform(_affineMatList[curIndex], Point2d(width/2,height/2)); +} + + +int TopoFinder::findNodeIndex(int imgNo) +{ + int imgIndex = 0; + for (int i = 0; i < _imgNum; i ++) + { + if (_visitOrder0[i].imgNo == imgNo) + { + imgIndex = i; + } + } + return imgIndex; +} + + +Mat_ TopoFinder::loadSimilarityMat() +{ + string filePath = Utils::baseDir + "Cache/similarityMat.txt"; + ifstream fin; + fin.open(filePath.c_str(), ios::in); + if (!fin.is_open()) + { + cout<<"File not found!\n"; + exit(0); + } + int nodeNum = _imgNum; + Mat_ similarityMat = Mat(nodeNum, nodeNum, CV_64FC1, Scalar(0)); + for (int i = 0; i < nodeNum; i ++) + { + //! avoid to read repeated data + //int offset = sizeof(int)*i; + //fin.seekg(offset, ios::cur); + for (int j = 0; j < nodeNum; j ++) + { + int Ptnum = 0; + fin>>Ptnum; + similarityMat(i,j) = Ptnum; + } + } + fin.close(); + + return similarityMat; +} + + +void TopoFinder::saveSimilarityMat(const Mat_ &similarityMat) +{ + string savePath = Utils::baseDir + "Cache/similarityMat.txt"; + ofstream fout; + fout.open(savePath.c_str(), ios::out); + if (!fout.is_open()) + { + cout<<"Path not exists!\n"; + exit(0); + } + int nodeNum = similarityMat.cols; +// fout< TopoFinder::findFastAffine(vector pointSet1, vector pointSet2) +{ + int step = max(1, int(pointSet1.size()/500)); + int pointNum = pointSet1.size()/step; + Mat_ affineMat(3, 3, CV_64FC1); + Mat A(2*pointNum, 6, CV_64FC1, Scalar(0)); + Mat L(2*pointNum, 1, CV_64FC1); + for (int i = 0; i < pointNum; i ++) + { + double x1 = pointSet1[i*step].x, y1 = pointSet1[i*step].y; + double x2 = pointSet2[i*step].x, y2 = pointSet2[i*step].y; + A.at(i*2,0) = x2; A.at(i*2,1) = y2; A.at(i*2,2) = 1; + A.at(i*2+1,3) = x2; A.at(i*2+1,4) = y2; A.at(i*2+1,5) = 1; + L.at(i*2,0) = x1; + L.at(i*2+1,0) = y1; + } + Mat_ X = (A.t()*A).inv()*(A.t()*L); + affineMat(0,0) = X(0); affineMat(0,1) = X(1); affineMat(0,2) = X(2); + affineMat(1,0) = X(3); affineMat(1,1) = X(4); affineMat(1,2) = X(5); + affineMat(2,0) = 0; affineMat(2,1) = 0; affineMat(2,2) = 1; + double var = 0; + //Utils::pointTransform(affineMat, pointSet2); + //for (int i = 0; i < pointNum; i ++) + //{ + + // double bias = (pointSet1[i].x-pointSet2[i].x)*(pointSet1[i].x-pointSet2[i].x) + + // (pointSet1[i].y-pointSet2[i].y)*(pointSet1[i].y-pointSet2[i].y); + // var += bias; + //} + //var /= (pointNum-6); + return affineMat; +} + + +void TopoFinder::loadKeyFiles() +{ + cout<<"Loading key files ..."< subIndexList; //! features of the target ocatve + + FILE *fin = fopen(filePath_.c_str(), "r"); + int PtNum = 0; + fscanf(fin, "%d", &PtNum); + for (int j = 0; j < PtNum; j ++) + { + Point2d point; + int octave = 0; + fscanf(fin, "%lf%lf%d", &point.x, &point.y, &octave); + bar.pts.push_back(point); + if (octave == Target_Octave) + { + subIndexList.push_back(j); + } + } + if (subIndexList.size() == 0) //! special case + { + //cout<<"Waring : the feature subset of image "<(j,k) = temp; + } + } + bar.descriptors = descriptors; + fclose(fin); + + _keyList.push_back(bar); + _subKeyIndexList.push_back(subIndexList); + } + cout<<"Completed!"< &pointSet1, vector &pointSet2) +{ + pointSet1.clear(); + pointSet2.clear(); + vector keyPts1, keyPts2; + keyPts1 = _keyList[imgIndex1].pts; + keyPts2 = _keyList[imgIndex2].pts; + Mat descriptors1, descriptors2; + descriptors1 = _keyList[imgIndex1].descriptors; + descriptors2 = _keyList[imgIndex2].descriptors; + + // Matching descriptor vectors using FLANN matcher + vector m_Matches; + FlannBasedMatcher matcher; + vector> knnmatches; + int num1 = keyPts1.size(), num2 = keyPts2.size(); + int kn = min(min(num1, num2), 5); + matcher.knnMatch(descriptors1, descriptors2, knnmatches, kn); + int i, j; + double minimaDsit = 99999; + for (i = 0; i < knnmatches.size(); i ++) + { + double dist = knnmatches[i][1].distance; + if (dist < minimaDsit) + { + minimaDsit = dist; + } + } + double fitedThreshold = minimaDsit * 5; + int keypointsize = knnmatches.size(); + for (i = 0; i < keypointsize; i ++) + { + const DMatch nearDist1 = knnmatches[i][0]; + const DMatch nearDist2 = knnmatches[i][1]; + double distanceRatio = nearDist1.distance / nearDist2.distance; + if (nearDist1.distance < fitedThreshold && distanceRatio < 0.7) + { + m_Matches.push_back(nearDist1); + } + } + + vector iniPts1, iniPts2; + for (i = 0; i < m_Matches.size(); i ++) //get initial match pairs + { + int queryIndex = m_Matches[i].queryIdx; + int trainIndex = m_Matches[i].trainIdx; + Point2d tempPt1 = keyPts1[queryIndex]; + Point2d tempPt2 = keyPts2[trainIndex]; + iniPts1.push_back(tempPt1); + iniPts2.push_back(tempPt2); + } + if (iniPts1.size() < 10) + { + return false; + } + + vector status; + //! utilize epi-polar geometry constraints to delete missing matches + Mat Fmatrix = findFundamentalMat(iniPts1, iniPts2, CV_RANSAC, 1.5, 0.99, status); + for (i = 0; i < status.size(); i ++) + { + if (status[i] == 1) + { + pointSet1.push_back(iniPts1[i]); + pointSet2.push_back(iniPts2[i]); + } + } + if (pointSet1.size() < 10) + { + return false; + } + + Mat homoMat = findHomography(iniPts2, iniPts1, CV_RANSAC, 2.5); //! Pt1 = homoMat*Pt2 + vector goodPts1, goodPts2; + for (i = 0; i < pointSet1.size(); i ++) //mean value + { + Point2d warpedPt; + Utils::pointTransform(homoMat, pointSet2[i], warpedPt); + double dist = 0; + dist = sqrt((warpedPt.x-pointSet1[i].x)*(warpedPt.x-pointSet1[i].x) + (warpedPt.y-pointSet1[i].y)*(warpedPt.y-pointSet1[i].y)); + if (dist < 2.0) + { + goodPts1.push_back(pointSet1[i]); + goodPts2.push_back(pointSet2[i]); + } + } + pointSet1 = goodPts1; + pointSet2 = goodPts2; + if (pointSet1.size() < 10) //! modify as 20 + { + return false; + } + cout<<"Image "<saveMatchPts(imgIndex1, imgIndex2, pointSet1, pointSet2); +// _Ptmatcher->drawMatches(imgIndex1, imgIndex2, pointSet1, pointSet2); + return true; +} + + +int TopoFinder::calSimilarNum(int imgIndex1, int imgIndex2) +{ + vector orgKeyPts1 = _keyList[imgIndex1].pts; + vector orgKeyPts2 = _keyList[imgIndex2].pts; + Mat orgDescriptors1, orgDescriptors2; + orgDescriptors1 = _keyList[imgIndex1].descriptors; + orgDescriptors2 = _keyList[imgIndex2].descriptors; + + vector keyPts1, keyPts2; + Mat descriptors1, descriptors2; + + vector subSet1 = _subKeyIndexList[imgIndex1], subSet2 = _subKeyIndexList[imgIndex2]; + int realNum1 = subSet1.size(), realNum2 = subSet2.size(); + //! sample subset 1 + for (int i = 0; i < realNum1; i ++) + { + int no = subSet1[i]; + keyPts1.push_back(orgKeyPts1[no]); + } + descriptors1 = Mat(realNum1, 64, CV_32FC1); + for (int i = 0; i < realNum1; i ++) + { + int no = subSet1[i]; + orgDescriptors1.row(no).copyTo(descriptors1.row(i)); + } + //! sample subset 2 + for (int i = 0; i < realNum2; i ++) + { + int no = subSet2[i]; + keyPts2.push_back(orgKeyPts2[no]); + } + descriptors2 = Mat(realNum2, 64, CV_32FC1); + for (int i = 0; i < realNum2; i ++) + { + int no = subSet2[i]; + orgDescriptors2.row(no).copyTo(descriptors2.row(i)); + } + // Matching descriptor vectors using FLANN matcher + vector m_Matches; + FlannBasedMatcher matcher; + vector> knnmatches; + int num1 = keyPts1.size(), num2 = keyPts2.size(); + int kn = min(min(num1, num2), 5); + matcher.knnMatch(descriptors1, descriptors2, knnmatches, kn); + double minimaDsit = 99999; + for (int i = 0; i < knnmatches.size(); i ++) + { + double dist = knnmatches[i][0].distance; + if (dist < minimaDsit) + { + minimaDsit = dist; + } + } + double fitedThreshold = minimaDsit * 5; + int keypointsize = knnmatches.size(); + for (int i = 0; i < keypointsize; i ++) + { + const DMatch nearDist1 = knnmatches[i][0]; + const DMatch nearDist2 = knnmatches[i][1]; + double distanceRatio = nearDist1.distance / nearDist2.distance; + if (nearDist1.distance < fitedThreshold && distanceRatio < 0.7) + { + m_Matches.push_back(nearDist1); + } + } + int num = m_Matches.size(); + return num; +} + + +//! ========= temperate funcs =========== +void TopoFinder::drawTopoNet() +{ + int i, j, k; + int minX = 999, minY = 999, maxX = 0, maxY = 0; + for (i = 0; i < _projCoordSet.size(); i ++) + { + Point2d tmpPt = _projCoordSet[i].centroid; + int x = int(fabs(tmpPt.x)+1)*(tmpPt.x < 0 ? -1 : 1); + int y = int(fabs(tmpPt.y)+1)*(tmpPt.y < 0 ? -1 : 1); + if (x > maxX) + maxX = x; + if (x < minX) + minX = x; + if (y > maxY) + maxY = y; + if (y < minY) + minY = y; + } + double width = maxX - minX; + double height = maxY - minY; + int imageRange = 2000; //maximum side_length + int edgeRange = 60; + double cvtScale = imageRange/min(height,width); + int imageRow = height * cvtScale + edgeRange*2; // add an edge space of 20 pixel + int imageCol = width * cvtScale + edgeRange*2; + Mat displayPlane(imageRow, imageCol, CV_8UC3, Scalar(255,255,255)); + + CvFont font; + double hScale = 1; + double vScale = 1; + cvInitFont(&font,CV_FONT_HERSHEY_PLAIN, hScale,vScale,0,1); // + vector dotPtList; + for (i = 0; i < _visitOrder0.size(); i ++) + { + Point2d point = _projCoordSet[i].centroid; + int c = int((point.x-minX) * cvtScale + 1) + edgeRange; + int r = int((point.y-minY) * cvtScale + 1) + edgeRange; + dotPtList.push_back(Point2i(c,r)); + circle(displayPlane, Point2i(c,r), 24, Scalar(255,0,0), -1); + //circle(displayPlane, Point2i(c,r), 2, Scalar(255,255,0), -1); + int imgNo = _visitOrder0[i].imgNo; + char text[100]; + sprintf(text,"%d", imgNo); + Point2i dotPt(c+3, r+3); +// cv::putText(displayPlane, text, dotPt, 2, 1, Scalar(0,0,0)); + } + for (i = 0; i < _visitOrder0.size()-1; i ++) //draw all related lines + { + for (j = i+1; j < _visitOrder0.size(); j ++) + { + int nodeNo1 = _visitOrder0[i].imgNo; + int nodeNo2 = _visitOrder0[j].imgNo; + int PtNum = _similarityMat(nodeNo1,nodeNo2); + if (PtNum > 0) + { + Point2i startPt = dotPtList[i]; + Point2i endPt = dotPtList[j]; + if (PtNum < 100 || 1) + { + line(displayPlane, startPt, endPt, Scalar(128,128,128), 2); + } + else + { + line(displayPlane, startPt, endPt, Scalar(0,255,0), 2); + } + } + } + } +/* for (i = 1; i < _visitOrder0.size(); i ++) //draw the related lines in MST + { + int refNo = _visitOrder0[i].refNo; + int refIndex = findNodeIndex(refNo); + Point2i startPt = dotPtList[i]; + Point2i endPt = dotPtList[refIndex]; + line(displayPlane, startPt, endPt, Scalar(0,0,255), 3); + }*/ + string savePath = Utils::baseDir + "/topoGraph.png"; + imwrite(savePath, displayPlane); + cout<<"The topology graph of images is saved!"< marginPtList; + int i, j; + for (i = 0; i < _visitOrder0.size(); i ++) + { + Mat_ homoMat = _affineMatList[i]; + int curImgNo = _visitOrder0[i].imgNo; + Size imgSize = _Ptmatcher->_imgSizeList[curImgNo]; + int height = imgSize.height, width = imgSize.width; + Point2d srcPt00(0,0), srcPt01(width,0), srcPt10(0,height), srcPt11(width,height); + Point2d dstPt00, dstPt01, dstPt10, dstPt11; + Utils::pointTransform(homoMat, srcPt00, dstPt00); + Utils::pointTransform(homoMat, srcPt01, dstPt01); + Utils::pointTransform(homoMat, srcPt10, dstPt10); + Utils::pointTransform(homoMat, srcPt11, dstPt11); + marginPtList.push_back(dstPt00); + marginPtList.push_back(dstPt01); + marginPtList.push_back(dstPt10); + marginPtList.push_back(dstPt11); + + } + int minX = 999, minY = 999, maxX = 0, maxY = 0; + for (i = 0; i < marginPtList.size(); i ++) + { + Point2d tmpPt = marginPtList[i]; + int x = int(fabs(tmpPt.x)+1)*(tmpPt.x < 0 ? -1 : 1); + int y = int(fabs(tmpPt.y)+1)*(tmpPt.y < 0 ? -1 : 1); + if (x > maxX) + maxX = x; + if (x < minX) + minX = x; + if (y > maxY) + maxY = y; + if (y < minY) + minY = y; + } + + Rect mosaicRect; + mosaicRect.x = minX; mosaicRect.y = minY; + mosaicRect.width = maxX-minX+1; mosaicRect.height = maxY-minY+1; + return mosaicRect; +} + + +void TopoFinder::TsaveMosaicImage() +{ + bool shallEach = false; + Rect mosaicRect = TsetImageSize(); + int newRow = mosaicRect.height, newCol = mosaicRect.width; + int i, j; + Rect newImgRect; + Mat stitchImage(newRow, newCol, CV_8UC3, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX)); + for (i = 0; i < _visitOrder0.size(); i ++) + { + int curImgNo = _visitOrder0[i].imgNo; + cout<<"Warping Image: "< homoMat = _affineMatList[i]; + Size imgSize = _Ptmatcher->_imgSizeList[curImgNo]; + int height = imgSize.height, width = imgSize.width; + Point2d srcPt00(0,0), srcPt01(width,0), srcPt10(0,height), srcPt11(width,height); + Point2d dstPt00, dstPt01, dstPt10, dstPt11; + Utils::pointTransform(homoMat, srcPt00, dstPt00); + Utils::pointTransform(homoMat, srcPt01, dstPt01); + Utils::pointTransform(homoMat, srcPt10, dstPt10); + Utils::pointTransform(homoMat, srcPt11, dstPt11); + + double fminX, fminY, fmaxX, fmaxY; + fminX = min(min(dstPt00.x, dstPt01.x), min(dstPt10.x, dstPt11.x)); + fmaxX = max(max(dstPt00.x, dstPt01.x), max(dstPt10.x, dstPt11.x)); + fminY = min(min(dstPt00.y, dstPt01.y), min(dstPt10.y, dstPt11.y)); + fmaxY = max(max(dstPt00.y, dstPt01.y), max(dstPt10.y, dstPt11.y)); + int minX, minY, maxX, maxY; + minX = int(fabs(fminX)+1)*(fminX < 0 ? -1 : 1); + maxX = int(fabs(fmaxX)+1)*(fmaxX < 0 ? -1 : 1); + minY = int(fabs(fminY)+1)*(fminY < 0 ? -1 : 1); + maxY = int(fabs(fmaxY)+1)*(fmaxY < 0 ? -1 : 1); + + int startX = minX-mosaicRect.x; int endX = startX+maxX-minX; + int startY = minY-mosaicRect.y; int endY = startY+maxY-minY; + int r, c; + Mat warpedImage(newRow, newCol, CV_8UC3, Scalar(BKGRNDPIX,BKGRNDPIX,BKGRNDPIX)); + string filePath = _Ptmatcher->_imgNameList[curImgNo]; + Mat image = imread(filePath); + Mat_ invHomoMat = homoMat.inv(); + for (r = startY; r < endY; r ++) + { + for (c = startX; c < endX; c ++) + { + int grayValueR, grayValueG, grayValueB; + Point2d dstPt(c+mosaicRect.x,r+mosaicRect.y), srcPt(0,0); + Utils::pointTransform(invHomoMat, dstPt, srcPt); + int u = int(srcPt.x), v = int(srcPt.y); + if (0 < u && width-1 > u && 0 < v && height-1 > v) + { + int grayValueR1 = BKGRNDPIX, grayValueR2 = BKGRNDPIX; + int grayValueG1 = BKGRNDPIX, grayValueG2 = BKGRNDPIX; + int grayValueB1 = BKGRNDPIX, grayValueB2 = BKGRNDPIX; + //bilinear interpolation + grayValueR1 = (image.at(v,u)[0]) * (1 - (srcPt.x-u)) + (image.at(v,u+1)[0]) * (srcPt.x-u); + grayValueG1 = (image.at(v,u)[1]) * (1 - (srcPt.x-u)) + (image.at(v,u+1)[1]) * (srcPt.x-u); + grayValueB1 = (image.at(v,u)[2]) * (1 - (srcPt.x-u)) + (image.at(v,u+1)[2]) * (srcPt.x-u); + + grayValueR2 = (image.at(v+1,u)[0]) * (1 - (srcPt.x-u)) + (image.at(v+1,u+1)[0]) * (srcPt.x-u); + grayValueG2 = (image.at(v+1,u)[1]) * (1 - (srcPt.x-u)) + (image.at(v+1,u+1)[1]) * (srcPt.x-u); + grayValueB2 = (image.at(v+1,u)[2]) * (1 - (srcPt.x-u)) + (image.at(v+1,u+1)[2]) * (srcPt.x-u); + + grayValueR = grayValueR1*(1 - (srcPt.y-v)) + grayValueR2*(srcPt.y-v); + grayValueG = grayValueG1*(1 - (srcPt.y-v)) + grayValueG2*(srcPt.y-v); + grayValueB = grayValueB1*(1 - (srcPt.y-v)) + grayValueB2*(srcPt.y-v); + + warpedImage.at(r,c)[0] = grayValueR; + warpedImage.at(r,c)[1] = grayValueG; + warpedImage.at(r,c)[2] = grayValueB; + + stitchImage.at(r,c)[0] = grayValueR; + stitchImage.at(r,c)[1] = grayValueG; + stitchImage.at(r,c)[2] = grayValueB; + } + } + } + if (!shallEach) + { + continue; + } + char name[512]; + sprintf(name,"/Masks/warp%d.png", curImgNo); + string savePath = Utils::baseDir + string(name); + imwrite(savePath, warpedImage); + } + string filePath = Utils::baseDir + "/topoMosaic.png"; + imwrite(filePath, stitchImage); +} + + +void TopoFinder::drawTreeLevel() +{ + Mat_ costGraph = Utils::buildCostGraph(_similarityMat); + vector newVisits = Graph::FloydForPath(costGraph); + vector coreLocations; + int i, j, k; + //! update the order of visit list + for (i = 0; i < newVisits.size(); i ++) + { + int imgNo = newVisits[i].imgNo; + int orgIndex = findNodeIndex(imgNo); + coreLocations.push_back(_projCoordSet[orgIndex].centroid); + } + //! label levels of spinning tree + vector groupCusorList; + groupCusorList.push_back(0); + for (int i = 1; i < newVisits.size(); i ++) + { + if (newVisits[i].level != newVisits[i-1].level) + { + groupCusorList.push_back(i); + } + } + int groupNum = groupCusorList.size(); + if (groupCusorList[groupNum-1] < _imgNum-1) + { + groupCusorList.push_back(_imgNum-1); + } + int minX = 999, minY = 999, maxX = 0, maxY = 0; + for (i = 0; i < _projCoordSet.size(); i ++) + { + Point2d tmpPt = _projCoordSet[i].centroid; + int x = int(fabs(tmpPt.x)+1)*(tmpPt.x < 0 ? -1 : 1); + int y = int(fabs(tmpPt.y)+1)*(tmpPt.y < 0 ? -1 : 1); + if (x > maxX) + maxX = x; + if (x < minX) + minX = x; + if (y > maxY) + maxY = y; + if (y < minY) + minY = y; + } + double width = maxX - minX; + double height = maxY - minY; + int imageRange = 1000; //maximum side_length + int edgeRange = 30; + double cvtScale = imageRange/min(height,width); + int imageRow = height * cvtScale + edgeRange*2; // add an edge space of 20 pixel + int imageCol = width * cvtScale + edgeRange*2; + Mat displayPlane(imageRow, imageCol, CV_8UC3, Scalar(255,255,255)); + //! label aligning group + vector dotPtList; + for (i = 0; i < groupCusorList.size(); i ++) + { + int sIndex = 0, eIndex = 0; + if (i != 0) + { + sIndex = groupCusorList[i-1]+1; + eIndex = groupCusorList[i]; + } + int r = rand()%255; + int g = rand()%255; + int b = rand()%255; + for (j = sIndex; j <= eIndex; j ++) + { + Point2d point = coreLocations[j]; + int c = int((point.x-minX) * cvtScale + 1) + edgeRange; + int r1 = int((point.y-minY) * cvtScale + 1) + edgeRange; + dotPtList.push_back(Point2i(c,r1)); + circle(displayPlane, Point2i(c,r1), 25, Scalar(r,g,b), -1); + } + } + //for (i = 0; i < _imgNum-1; i ++) //draw all related lines + //{ + // for (j = i+1; j < _imgNum; j ++) + // { + // int imgNo1 = _visitOrder0[i].imgNo; + // int imgNo2 = _visitOrder0[j].imgNo; + // int PtNum = _similarityMat(imgNo1,imgNo2); + // if (PtNum != 0) + // { + // Point2i startPt = dotPtList[i]; + // Point2i endPt = dotPtList[j]; + // if (PtNum < 100) + // { + // line(displayPlane, startPt, endPt, Scalar(128,128,128), 1); + // } + // else + // { + // line(displayPlane, startPt, endPt, Scalar(0,255,0), 1); + // } + // } + // } + //} + for (i = 1; i < newVisits.size(); i ++) //draw the related lines in MST + { + int refNo = newVisits[i].refNo; + int refIndex = findNodeIndex(refNo); + Point2i startPt = dotPtList[i]; + Point2d refNoPos = _projCoordSet[refIndex].centroid; + int c = int((refNoPos.x-minX) * cvtScale + 1) + edgeRange; + int r1 = int((refNoPos.y-minY) * cvtScale + 1) + edgeRange; + Point2i endPt(c,r1); + line(displayPlane, startPt, endPt, Scalar(0,0,255), 2); + } + string savePath = Utils::baseDir + "/spinningTree.jpg"; + imwrite(savePath, displayPlane); +} \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Mosaic/topology.h b/ref/AutoStitching/source/Src/Mosaic/topology.h new file mode 100644 index 0000000..968e5f7 --- /dev/null +++ b/ref/AutoStitching/source/Src/Mosaic/topology.h @@ -0,0 +1,102 @@ +#pragma once +#include "Utils/util.h" +#include "featureMatch.h" +#include "graphPro.h" +#include +#include +#include +#include +#include "opencv2/nonfree/nonfree.hpp" +#include +#include + +#define Target_Octave 1 //! select subset of features for building similarity table + +using namespace std; +using namespace cv; + +struct BiNode +{ + int preNo; + int curNo; +}; + +struct Quadra +{ + Point2d centroid; + Size imgSize; +// Point2d nodes[4]; + Point2d RME; +}; + +struct Keys +{ + vector pts; + Mat descriptors; +}; + +// ============== NOTIFICATION =============== // +//! node is encoded from 0, 2, ..., n-1. // +//! cost graph: cost of non-overlap pair is -1 // +// =========================================== // + +#define Load_Matches 0 //! just for debugging + +class TopoFinder +{ +public: + TopoFinder(PointMatcher *matcher) + { + _Ptmatcher = matcher; + _imgNum = _Ptmatcher->_imgSizeList.size(); + _shotNum = _attempNum = 0; + _totalTime = _matchTime = 0; + _isInOrder = false; + }; + ~TopoFinder(){}; + +public: + //! return the topology depicted as a cost/weight table + Mat_ findTopology(bool shallLoad, bool isInOrder); + Mat_ loadSimilarityMat(); + void saveSimilarityMat(const Mat_ &similarityMat); + //! similarity value : number of matched features between image pair + Mat_ detectSimilarityOnGlobal(); + Mat_ detectSimilarityByGuiding(); + void searchMainChain(); + void buildMainChain(); + //! detect potential overlaps and recalculate aligning model + void detectPotentialOverlap(int curIndex, vector &pointSet1, vector &pointSet2); + //! vocabulary tree -> association/guiding table + Mat_ getGuidingTable(); //! not implemented + Mat_ getGuidingTableP(); //! select features extracted from the top octave + + int findNodeIndex(int imgNo); + //! X1 = Model * X2 + Mat_ findFastAffine(vector pointSet1, vector pointSet2); + void loadKeyFiles(); + bool featureMatcher(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2); + int calSimilarNum(int imgIndex1, int imgIndex2); + //! temperate functions + void drawTopoNet(); + Rect TsetImageSize(); + void TsaveMosaicImage(); + void drawTreeLevel(); + +private: + int _imgNum; + Mat_ _similarityMat; + Mat_ _attempMap; //! only for unordered mode : 1 means attempted already + bool _isInOrder; + + vector _visitOrder0; //! the alignment order + vector > _affineMatList; //! same order with "_visitOrder0" + vector > _covMatrixList; + vector _projCoordSet; //! same order with "_visitOrder0" + PointMatcher *_Ptmatcher; + vector _keyList; //! same with image no. + vector > _subKeyIndexList; //! subset for building similarity table + //! variables for efficiency analysis + int _attempNum, _shotNum; + int _totalTime, _matchTime; +}; \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Utils/CMakeLists.txt b/ref/AutoStitching/source/Src/Utils/CMakeLists.txt new file mode 100644 index 0000000..0a7c2a4 --- /dev/null +++ b/ref/AutoStitching/source/Src/Utils/CMakeLists.txt @@ -0,0 +1,29 @@ +PROJECT(Utils) +STRING(TOUPPER ${PROJECT_NAME} PROJECT_NAME_CAPITALIZED) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.3) +ADD_DEFINITIONS(-DUNICODE) + +#Use MFC in a Shared DLL +ADD_DEFINITIONS(-D_AFXDLL) +SET(CMAKE_MFC_FLAG 2) + +FILE(GLOB_RECURSE HDRS_FILES *.h *.hpp) +FILE(GLOB_RECURSE SRCS_FILES *.cpp) +FILE(GLOB_RECURSE UI_FILES *.ui) +FILE(GLOB CD_FILES *.cd) + + +SET(FILES_TO_TRANSLATE ${FILES_TO_TRANSLATE} ${SRCS_FILES} ${UI_FILES} ${HDRS_FILES} PARENT_SCOPE) + +SOURCE_GROUP("UI Files" FILES ${UI_FILES}) +SOURCE_GROUP("Generated Files" FILES ${MOC_SRCS} ${UI_HDRS} ${RSC_SRCS}) +SOURCE_GROUP("Class Diagrams" FILES ${CD_FILES} ) +#SOURCE_GROUP("Resources" FILES ${RSCS} ) + +ADD_LIBRARY(${PROJECT_NAME} STATIC ${HDRS_FILES} ${SRCS_FILES} ${UI_HDRS} ${UI_FILES} ${RSC_SRCS} ${MOC_SRCS} ${CD_FILES}) +#ADD_DEPENDENCIES(${PROJECT_NAME}) +SET_SOURCE_FILES_PROPERTIES(${CD_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) # DO NOT COMPILE CS FILES +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS} libf2cd.lib BLASd.lib clapackd.lib tmglibd.lib levmar.lib) + +SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES FOLDER SRC) +INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/ref/AutoStitching/source/Src/Utils/util.cpp b/ref/AutoStitching/source/Src/Utils/util.cpp new file mode 100644 index 0000000..e05d3f1 --- /dev/null +++ b/ref/AutoStitching/source/Src/Utils/util.cpp @@ -0,0 +1,215 @@ +#include "util.h" + +vector Utils::get_filelist(string foldname) +{ + string mainPath = foldname; + foldname += "/*.*"; + const char * mystr=foldname.c_str(); + vector flist; + string lineStr; + vector extendName; + extendName.push_back("jpg"); + extendName.push_back("png"); + extendName.push_back("tif"); + extendName.push_back("JPG"); + extendName.push_back("bmp"); + + HANDLE file; + WIN32_FIND_DATA fileData; + char line[1024]; + wchar_t fn[1000]; + mbstowcs(fn,mystr,999); + file = FindFirstFile(fn, &fileData); + FindNextFile(file, &fileData); + while(FindNextFile(file, &fileData)) + { + wcstombs(line,(const wchar_t*)fileData.cFileName,259); + lineStr = line; + for (int i = 0; i < 5; i ++) //ųͼļ + { + if (lineStr.find(extendName[i]) < 999) + { + lineStr = mainPath + "/" + lineStr; + flist.push_back(lineStr); + break; + } + } + } + cout<<"loaded "< 255 + //! 255, 127, 0 -> 204 + //! 255, 255, 0 -> 153 + //! 0, 255, 0 -> 102 + //! 0, 255, 255 -> 51 + //! 0, 0, 255 -> 0 + int row = grayMap.rows, col = grayMap.cols; + Mat colorMap(row, col, CV_8UC3, Scalar(0,0,0)); + uchar *dataPtr = (uchar*)grayMap.data; + uchar *dataPtrT = (uchar*)colorMap.data; + for (int i = 0; i < row; i ++) + { + for (int j = 0; j < col; j ++) + { + int pix = dataPtr[i*col+j]; + int B = 0, G = 0, R = 0; + if (pix <= 51) + { + B = 255; + G = pix*5; + R = 0; + } + else if (pix <= 102) + { + pix-=51; + B = 255-pix*5; + G = 255; + R = 0; + } + else if (pix <= 153) + { + pix-=102; + B = 0; + G = 255; + R = pix*5; + } + else if (pix <= 204) + { + pix-=153; + B = 0; + G = 255-uchar(128.0*pix/51.0+0.5); + R = 255; + } + else + { + pix-=204; + B = 0; + G = 127-uchar(127.0*pix/51.0+0.5); + R = 255; + } + dataPtrT[3*(i*col+j)+0] = B; + dataPtrT[3*(i*col+j)+1] = G; + dataPtrT[3*(i*col+j)+2] = R; + //colorMap.at(i,j)[0] = B; + //colorMap.at(i,j)[1] = G; + //colorMap.at(i,j)[2] = R; + } + } + return colorMap; +} + + +bool Utils::loadMatchPts(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2) +{ + bool exchanged = false; + if (imgIndex1 > imgIndex2) //set a consistent standard: smaller index in the left + { + int temp = imgIndex2; + imgIndex2 = imgIndex1; + imgIndex1 = temp; + exchanged = true; + } + char fileName[1024]; + sprintf(fileName, "Cache/matchPtfile/match%d&%d.txt", imgIndex1, imgIndex2); + string filePath = Utils::baseDir + string(fileName); + FILE *fin = fopen(filePath.c_str(), "r"); + if (fin == nullptr) + { + return false; + } + int PtNum = 0; + fscanf(fin, "%d", &PtNum); + if (!exchanged) + { + for (int i = 0; i < PtNum; i ++) + { + double x1, y1, x2, y2; + fscanf(fin, "%lf %lf %lf %lf", &x1, &y1, &x2, &y2); + Point2d point1(x1,y1), point2(x2,y2); + pointSet1.push_back(point1); + pointSet2.push_back(point2); + } + } + else + { + for (int i = 0; i < PtNum; i ++) + { + double x1, y1, x2, y2; + fscanf(fin, "%lf %lf %lf %lf", &x1, &y1, &x2, &y2); + Point2d point1(x1,y1), point2(x2,y2); + pointSet1.push_back(point2); + pointSet2.push_back(point1); + } + } + fclose(fin); +// cout<<"Loaded "< Utils::buildCostGraph(const Mat_ &similarMat) +{ + int nodeNum = similarMat.rows; + //! considering the precise and robustness, we take logarithm as the weight function + Mat_ costGraph = Mat(nodeNum, nodeNum, CV_64FC1, Scalar(-1)); + for (int i = 0; i < nodeNum-1; i ++) + { + for (int j = i+1; j < nodeNum; j ++) + { + int num = similarMat(i,j); + if (num == 0) + { + continue; + } + double cost = 6/log(num+50.0); + costGraph(i,j) = cost; + costGraph(j,i) = cost; + } + } + return costGraph; +} + + +Point2d Utils::pointTransform(Mat_ homoMat, Point2d srcPt) +{ + Mat_ srcX = (Mat_(3,1)<< srcPt.x, srcPt.y, 1); + Mat_ dstX = homoMat * srcX; + Point2d dstPt = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2)); + return dstPt; +} + + +void Utils::pointTransform(Mat_ homoMat, Point2d srcPt, Point2d &dstPt) +{ + Mat_ srcX = (Mat_(3,1)<< srcPt.x, srcPt.y, 1); + Mat_ dstX = homoMat * srcX; + dstPt = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2)); +} + + +void Utils::pointTransform(Mat_ homoMat, vector &pointSet) +{ + for (int i = 0; i < pointSet.size(); i ++) + { + Mat_ srcX = (Mat_(3,1)<< pointSet[i].x, pointSet[i].y, 1); + Mat_ dstX = homoMat * srcX; + Point2d dstPt = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2)); + pointSet[i] = dstPt; + } +} + + +double Utils::calPointDist(Point2d point1, Point2d point2) +{ + return sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y)); +} + + +double Utils::calVecDot(Point2d vec1, Point2d vec2) +{ + return vec1.x*vec2.x+vec1.y*vec2.y; +} \ No newline at end of file diff --git a/ref/AutoStitching/source/Src/Utils/util.h b/ref/AutoStitching/source/Src/Utils/util.h new file mode 100644 index 0000000..60ea234 --- /dev/null +++ b/ref/AutoStitching/source/Src/Utils/util.h @@ -0,0 +1,43 @@ +#pragma once +#include +#include +#include +#include +#include "cv.h" +#include "opencv2/highgui/highgui.hpp" +#include "opencv2/imgproc/imgproc.hpp" + +using namespace std; +using namespace cv; + +namespace Utils +{ + // ********** global variable list ********** // + static string baseDir = "C:/Users/Richard/Desktop/AutoMosaic/Source/Data/"; + + struct TreeNode + { + TreeNode(){}; + TreeNode(int im, int re, int le) + { + imgNo = im; + refNo = re; + level = le; + }; + + int level; //! the level of node in the tree + int imgNo; //! node no. + int refNo; //! parent node no. + }; + + vector get_filelist(string foldname); + Mat_ buildCostGraph(const Mat_ &similarMat); + bool loadMatchPts(int imgIndex1, int imgIndex2, vector &pointSet1, vector &pointSet2); + Point2d pointTransform(Mat_ homoMat, Point2d srcPt); + void pointTransform(Mat_ homoMat, Point2d srcPt, Point2d &dstPt); + void pointTransform(Mat_ homoMat, vector &pointSet); + double calPointDist(Point2d point1, Point2d point2); + double calVecDot(Point2d vec1, Point2d vec2); + //! convert gray image to pesudo-color image + Mat grayToPesudoColor(Mat grayMap); +} diff --git a/ref/ceres-solver-2.2.0.zip b/ref/ceres-solver-2.2.0.zip new file mode 100644 index 0000000..52ee17d Binary files /dev/null and b/ref/ceres-solver-2.2.0.zip differ