melage 0.0.65__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. melage/__init__.py +16 -0
  2. melage/cli.py +4 -0
  3. melage/graphics/GLGraphicsItem.py +286 -0
  4. melage/graphics/GLViewWidget.py +595 -0
  5. melage/graphics/Transform3D.py +55 -0
  6. melage/graphics/__init__.py +8 -0
  7. melage/graphics/functions.py +101 -0
  8. melage/graphics/items/GLAxisItem.py +149 -0
  9. melage/graphics/items/GLGridItem.py +178 -0
  10. melage/graphics/items/GLPolygonItem.py +77 -0
  11. melage/graphics/items/GLScatterPlotItem.py +135 -0
  12. melage/graphics/items/GLVolumeItem.py +280 -0
  13. melage/graphics/items/GLVolumeItem_b.py +237 -0
  14. melage/graphics/items/__init__.py +0 -0
  15. melage/graphics/shaders.py +202 -0
  16. melage/main.py +270 -0
  17. melage/requirements22.txt +25 -0
  18. melage/requirements_old.txt +28 -0
  19. melage/resource/0circle.png +0 -0
  20. melage/resource/0circle_faded.png +0 -0
  21. melage/resource/3d.png +0 -0
  22. melage/resource/3d.psd +0 -0
  23. melage/resource/3dFaded.png +0 -0
  24. melage/resource/Eraser.png +0 -0
  25. melage/resource/EraserFaded.png +0 -0
  26. melage/resource/EraserX.png +0 -0
  27. melage/resource/EraserXFaded.png +0 -0
  28. melage/resource/Eraser_icon.svg +79 -0
  29. melage/resource/Hand.png +0 -0
  30. melage/resource/HandIcons_0.png +0 -0
  31. melage/resource/Hand_IX.png +0 -0
  32. melage/resource/Hand_IXFaded.png +0 -0
  33. melage/resource/Handsqueezed.png +0 -0
  34. melage/resource/Handwriting (copy).png +0 -0
  35. melage/resource/Handwriting.png +0 -0
  36. melage/resource/HandwritingMinus.png +0 -0
  37. melage/resource/HandwritingMinusX.png +0 -0
  38. melage/resource/HandwritingPlus.png +0 -0
  39. melage/resource/HandwritingPlusX.png +0 -0
  40. melage/resource/Move_icon.svg +8 -0
  41. melage/resource/PngItem_2422924.png +0 -0
  42. melage/resource/about.png +0 -0
  43. melage/resource/about_logo.png +0 -0
  44. melage/resource/about_logo0.png +0 -0
  45. melage/resource/action_check.png +0 -0
  46. melage/resource/action_check_OFF.png +0 -0
  47. melage/resource/arrow).png +0 -0
  48. melage/resource/arrow.png +0 -0
  49. melage/resource/arrowFaded.png +0 -0
  50. melage/resource/arrow_org.png +0 -0
  51. melage/resource/arrow_org.png.png +0 -0
  52. melage/resource/arrows.png +0 -0
  53. melage/resource/authors.mp4 +0 -0
  54. melage/resource/box.png +0 -0
  55. melage/resource/check-image-icon-0.jpg +0 -0
  56. melage/resource/circle.png +0 -0
  57. melage/resource/circle_faded.png +0 -0
  58. melage/resource/circle_or.png +0 -0
  59. melage/resource/close.png +0 -0
  60. melage/resource/close_bg.png +0 -0
  61. melage/resource/color/Simple.txt +18 -0
  62. melage/resource/color/Tissue.txt +24 -0
  63. melage/resource/color/Tissue12.txt +27 -0
  64. melage/resource/color/albert_LUT.txt +102 -0
  65. melage/resource/color/mcrib_LUT.txt +102 -0
  66. melage/resource/color/pediatric1.txt +29 -0
  67. melage/resource/color/pediatric1_old.txt +27 -0
  68. melage/resource/color/pediatric2.txt +87 -0
  69. melage/resource/color/pediatric3.txt +29 -0
  70. melage/resource/color/pediatrics (copy).csv +103 -0
  71. melage/resource/color/tissue_seg.txt +4 -0
  72. melage/resource/contour.png +0 -0
  73. melage/resource/contour.svg +2 -0
  74. melage/resource/contourFaded.png +0 -0
  75. melage/resource/contourX.png +0 -0
  76. melage/resource/contourXFaded.png +0 -0
  77. melage/resource/dti.png +0 -0
  78. melage/resource/dti0.png +0 -0
  79. melage/resource/dti222.png +0 -0
  80. melage/resource/dti_or.png +0 -0
  81. melage/resource/eco.png +0 -0
  82. melage/resource/eco22.png +0 -0
  83. melage/resource/eco_old.png +0 -0
  84. melage/resource/eco_or.png +0 -0
  85. melage/resource/eco_or2.png +0 -0
  86. melage/resource/eco_seg.png +0 -0
  87. melage/resource/eco_seg_old.png +0 -0
  88. melage/resource/export.png +0 -0
  89. melage/resource/hand-grab-icon-10.jpg +0 -0
  90. melage/resource/hand-grab-icon-25.jpg +0 -0
  91. melage/resource/info.png +0 -0
  92. melage/resource/line.png +0 -0
  93. melage/resource/linefaded.png +0 -0
  94. melage/resource/load.png +0 -0
  95. melage/resource/main.ico +0 -0
  96. melage/resource/manual_images/3D_rightc.png +0 -0
  97. melage/resource/manual_images/3D_rightc_goto.png +0 -0
  98. melage/resource/manual_images/3D_rightc_paint.png +0 -0
  99. melage/resource/manual_images/3D_rightc_paint_draw1.png +0 -0
  100. melage/resource/manual_images/3D_rightc_paint_draw2.png +0 -0
  101. melage/resource/manual_images/3D_rightc_paint_render.png +0 -0
  102. melage/resource/manual_images/3D_rightc_paint_render2.png +0 -0
  103. melage/resource/manual_images/3D_rightc_paint_render3.png +0 -0
  104. melage/resource/manual_images/3D_rightc_paint_render4.png +0 -0
  105. melage/resource/manual_images/3D_rightc_paint_render5.png +0 -0
  106. melage/resource/manual_images/3D_rightc_paint_render6.png +0 -0
  107. melage/resource/manual_images/3D_rightc_seg.png +0 -0
  108. melage/resource/manual_images/exit_toolbar.png +0 -0
  109. melage/resource/manual_images/load_image_file.png +0 -0
  110. melage/resource/manual_images/load_image_file_openp.png +0 -0
  111. melage/resource/manual_images/main_page.png +0 -0
  112. melage/resource/manual_images/menu_file.png +0 -0
  113. melage/resource/manual_images/menu_file_export.png +0 -0
  114. melage/resource/manual_images/menu_file_import.png +0 -0
  115. melage/resource/manual_images/menu_file_settings.png +0 -0
  116. melage/resource/manual_images/menu_file_ss.png +0 -0
  117. melage/resource/manual_images/open_save_load.png +0 -0
  118. melage/resource/manual_images/panning_toolbar.png +0 -0
  119. melage/resource/manual_images/segmentation_toolbar.png +0 -0
  120. melage/resource/manual_images/tab_mri.png +0 -0
  121. melage/resource/manual_images/tab_us.png +0 -0
  122. melage/resource/manual_images/tabs.png +0 -0
  123. melage/resource/manual_images/toolbar_tools.png +0 -0
  124. melage/resource/manual_images/tools_basic.png +0 -0
  125. melage/resource/manual_images/tools_bet.png +0 -0
  126. melage/resource/manual_images/tools_cs.png +0 -0
  127. melage/resource/manual_images/tools_deepbet.png +0 -0
  128. melage/resource/manual_images/tools_imageinfo.png +0 -0
  129. melage/resource/manual_images/tools_maskO.png +0 -0
  130. melage/resource/manual_images/tools_masking.png +0 -0
  131. melage/resource/manual_images/tools_n4b.png +0 -0
  132. melage/resource/manual_images/tools_resize.png +0 -0
  133. melage/resource/manual_images/tools_ruler.png +0 -0
  134. melage/resource/manual_images/tools_seg.png +0 -0
  135. melage/resource/manual_images/tools_threshold.png +0 -0
  136. melage/resource/manual_images/tools_tools.png +0 -0
  137. melage/resource/manual_images/widget_color.png +0 -0
  138. melage/resource/manual_images/widget_color_add.png +0 -0
  139. melage/resource/manual_images/widget_color_add2.png +0 -0
  140. melage/resource/manual_images/widget_color_additional.png +0 -0
  141. melage/resource/manual_images/widget_images.png +0 -0
  142. melage/resource/manual_images/widget_images2.png +0 -0
  143. melage/resource/manual_images/widget_images3.png +0 -0
  144. melage/resource/manual_images/widget_marker.png +0 -0
  145. melage/resource/manual_images/widget_mri.png +0 -0
  146. melage/resource/manual_images/widget_mri2.png +0 -0
  147. melage/resource/manual_images/widget_segintensity.png +0 -0
  148. melage/resource/manual_images/widget_tab_mutualview.png +0 -0
  149. melage/resource/manual_images/widget_tab_mutualview2.png +0 -0
  150. melage/resource/manual_images/widget_table.png +0 -0
  151. melage/resource/manual_images/widget_table2.png +0 -0
  152. melage/resource/manual_images/widget_us.png +0 -0
  153. melage/resource/melage_top.ico +0 -0
  154. melage/resource/melage_top.png +0 -0
  155. melage/resource/melage_top0.png +0 -0
  156. melage/resource/melage_top1.png +0 -0
  157. melage/resource/melage_top4.png +0 -0
  158. melage/resource/mri (copy).png +0 -0
  159. melage/resource/mri.png +0 -0
  160. melage/resource/mri0.png +0 -0
  161. melage/resource/mri000.png +0 -0
  162. melage/resource/mri22.png +0 -0
  163. melage/resource/mri_big.png +0 -0
  164. melage/resource/mri_old.png +0 -0
  165. melage/resource/mri_seg.png +0 -0
  166. melage/resource/mri_seg_old.png +0 -0
  167. melage/resource/new.png +0 -0
  168. melage/resource/open.png +0 -0
  169. melage/resource/open2.png +0 -0
  170. melage/resource/pan.png +0 -0
  171. melage/resource/pencil.png +0 -0
  172. melage/resource/pencilFaded.png +0 -0
  173. melage/resource/points.png +0 -0
  174. melage/resource/pointsFaded.png +0 -0
  175. melage/resource/rotate.png +0 -0
  176. melage/resource/ruler.png +0 -0
  177. melage/resource/rulerFaded.png +0 -0
  178. melage/resource/s.png +0 -0
  179. melage/resource/s.psd +0 -0
  180. melage/resource/save.png +0 -0
  181. melage/resource/saveas.png +0 -0
  182. melage/resource/seg_mri.png +0 -0
  183. melage/resource/seg_mri2.png +0 -0
  184. melage/resource/settings.png +0 -0
  185. melage/resource/synch.png +0 -0
  186. melage/resource/synchFaded.png +0 -0
  187. melage/resource/theme/rc/.keep +1 -0
  188. melage/resource/theme/rc/arrow_down.png +0 -0
  189. melage/resource/theme/rc/arrow_down@2x.png +0 -0
  190. melage/resource/theme/rc/arrow_down_disabled.png +0 -0
  191. melage/resource/theme/rc/arrow_down_disabled@2x.png +0 -0
  192. melage/resource/theme/rc/arrow_down_focus.png +0 -0
  193. melage/resource/theme/rc/arrow_down_focus@2x.png +0 -0
  194. melage/resource/theme/rc/arrow_down_pressed.png +0 -0
  195. melage/resource/theme/rc/arrow_down_pressed@2x.png +0 -0
  196. melage/resource/theme/rc/arrow_left.png +0 -0
  197. melage/resource/theme/rc/arrow_left@2x.png +0 -0
  198. melage/resource/theme/rc/arrow_left_disabled.png +0 -0
  199. melage/resource/theme/rc/arrow_left_disabled@2x.png +0 -0
  200. melage/resource/theme/rc/arrow_left_focus.png +0 -0
  201. melage/resource/theme/rc/arrow_left_focus@2x.png +0 -0
  202. melage/resource/theme/rc/arrow_left_pressed.png +0 -0
  203. melage/resource/theme/rc/arrow_left_pressed@2x.png +0 -0
  204. melage/resource/theme/rc/arrow_right.png +0 -0
  205. melage/resource/theme/rc/arrow_right@2x.png +0 -0
  206. melage/resource/theme/rc/arrow_right_disabled.png +0 -0
  207. melage/resource/theme/rc/arrow_right_disabled@2x.png +0 -0
  208. melage/resource/theme/rc/arrow_right_focus.png +0 -0
  209. melage/resource/theme/rc/arrow_right_focus@2x.png +0 -0
  210. melage/resource/theme/rc/arrow_right_pressed.png +0 -0
  211. melage/resource/theme/rc/arrow_right_pressed@2x.png +0 -0
  212. melage/resource/theme/rc/arrow_up.png +0 -0
  213. melage/resource/theme/rc/arrow_up@2x.png +0 -0
  214. melage/resource/theme/rc/arrow_up_disabled.png +0 -0
  215. melage/resource/theme/rc/arrow_up_disabled@2x.png +0 -0
  216. melage/resource/theme/rc/arrow_up_focus.png +0 -0
  217. melage/resource/theme/rc/arrow_up_focus@2x.png +0 -0
  218. melage/resource/theme/rc/arrow_up_pressed.png +0 -0
  219. melage/resource/theme/rc/arrow_up_pressed@2x.png +0 -0
  220. melage/resource/theme/rc/base_icon.png +0 -0
  221. melage/resource/theme/rc/base_icon@2x.png +0 -0
  222. melage/resource/theme/rc/base_icon_disabled.png +0 -0
  223. melage/resource/theme/rc/base_icon_disabled@2x.png +0 -0
  224. melage/resource/theme/rc/base_icon_focus.png +0 -0
  225. melage/resource/theme/rc/base_icon_focus@2x.png +0 -0
  226. melage/resource/theme/rc/base_icon_pressed.png +0 -0
  227. melage/resource/theme/rc/base_icon_pressed@2x.png +0 -0
  228. melage/resource/theme/rc/branch_closed.png +0 -0
  229. melage/resource/theme/rc/branch_closed@2x.png +0 -0
  230. melage/resource/theme/rc/branch_closed_disabled.png +0 -0
  231. melage/resource/theme/rc/branch_closed_disabled@2x.png +0 -0
  232. melage/resource/theme/rc/branch_closed_focus.png +0 -0
  233. melage/resource/theme/rc/branch_closed_focus@2x.png +0 -0
  234. melage/resource/theme/rc/branch_closed_pressed.png +0 -0
  235. melage/resource/theme/rc/branch_closed_pressed@2x.png +0 -0
  236. melage/resource/theme/rc/branch_end.png +0 -0
  237. melage/resource/theme/rc/branch_end@2x.png +0 -0
  238. melage/resource/theme/rc/branch_end_disabled.png +0 -0
  239. melage/resource/theme/rc/branch_end_disabled@2x.png +0 -0
  240. melage/resource/theme/rc/branch_end_focus.png +0 -0
  241. melage/resource/theme/rc/branch_end_focus@2x.png +0 -0
  242. melage/resource/theme/rc/branch_end_pressed.png +0 -0
  243. melage/resource/theme/rc/branch_end_pressed@2x.png +0 -0
  244. melage/resource/theme/rc/branch_line.png +0 -0
  245. melage/resource/theme/rc/branch_line@2x.png +0 -0
  246. melage/resource/theme/rc/branch_line_disabled.png +0 -0
  247. melage/resource/theme/rc/branch_line_disabled@2x.png +0 -0
  248. melage/resource/theme/rc/branch_line_focus.png +0 -0
  249. melage/resource/theme/rc/branch_line_focus@2x.png +0 -0
  250. melage/resource/theme/rc/branch_line_pressed.png +0 -0
  251. melage/resource/theme/rc/branch_line_pressed@2x.png +0 -0
  252. melage/resource/theme/rc/branch_more.png +0 -0
  253. melage/resource/theme/rc/branch_more@2x.png +0 -0
  254. melage/resource/theme/rc/branch_more_disabled.png +0 -0
  255. melage/resource/theme/rc/branch_more_disabled@2x.png +0 -0
  256. melage/resource/theme/rc/branch_more_focus.png +0 -0
  257. melage/resource/theme/rc/branch_more_focus@2x.png +0 -0
  258. melage/resource/theme/rc/branch_more_pressed.png +0 -0
  259. melage/resource/theme/rc/branch_more_pressed@2x.png +0 -0
  260. melage/resource/theme/rc/branch_open.png +0 -0
  261. melage/resource/theme/rc/branch_open@2x.png +0 -0
  262. melage/resource/theme/rc/branch_open_disabled.png +0 -0
  263. melage/resource/theme/rc/branch_open_disabled@2x.png +0 -0
  264. melage/resource/theme/rc/branch_open_focus.png +0 -0
  265. melage/resource/theme/rc/branch_open_focus@2x.png +0 -0
  266. melage/resource/theme/rc/branch_open_pressed.png +0 -0
  267. melage/resource/theme/rc/branch_open_pressed@2x.png +0 -0
  268. melage/resource/theme/rc/checkbox_checked.png +0 -0
  269. melage/resource/theme/rc/checkbox_checked0.png +0 -0
  270. melage/resource/theme/rc/checkbox_checked@2x.png +0 -0
  271. melage/resource/theme/rc/checkbox_checked@2x0.png +0 -0
  272. melage/resource/theme/rc/checkbox_checked@2x000.png.png +0 -0
  273. melage/resource/theme/rc/checkbox_checked_disabled.png +0 -0
  274. melage/resource/theme/rc/checkbox_checked_disabled0.png +0 -0
  275. melage/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
  276. melage/resource/theme/rc/checkbox_checked_disabled@2x0.png +0 -0
  277. melage/resource/theme/rc/checkbox_checked_focus.png +0 -0
  278. melage/resource/theme/rc/checkbox_checked_focus0.png +0 -0
  279. melage/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
  280. melage/resource/theme/rc/checkbox_checked_focus@2x0.png +0 -0
  281. melage/resource/theme/rc/checkbox_checked_pressed.png +0 -0
  282. melage/resource/theme/rc/checkbox_checked_pressed0.png +0 -0
  283. melage/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
  284. melage/resource/theme/rc/checkbox_checked_pressed@2x0.png +0 -0
  285. melage/resource/theme/rc/checkbox_indeterminate.png +0 -0
  286. melage/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
  287. melage/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
  288. melage/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
  289. melage/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
  290. melage/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
  291. melage/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
  292. melage/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
  293. melage/resource/theme/rc/checkbox_unchecked.png +0 -0
  294. melage/resource/theme/rc/checkbox_unchecked0.png +0 -0
  295. melage/resource/theme/rc/checkbox_unchecked00.png +0 -0
  296. melage/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
  297. melage/resource/theme/rc/checkbox_unchecked@2x0.png +0 -0
  298. melage/resource/theme/rc/checkbox_unchecked@2x00.png +0 -0
  299. melage/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
  300. melage/resource/theme/rc/checkbox_unchecked_disabled0.png +0 -0
  301. melage/resource/theme/rc/checkbox_unchecked_disabled00.png +0 -0
  302. melage/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
  303. melage/resource/theme/rc/checkbox_unchecked_disabled@2x0.png +0 -0
  304. melage/resource/theme/rc/checkbox_unchecked_disabled@2x00.png +0 -0
  305. melage/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
  306. melage/resource/theme/rc/checkbox_unchecked_focus0.png +0 -0
  307. melage/resource/theme/rc/checkbox_unchecked_focus00.png +0 -0
  308. melage/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
  309. melage/resource/theme/rc/checkbox_unchecked_focus@2x0.png +0 -0
  310. melage/resource/theme/rc/checkbox_unchecked_focus@2x00.png +0 -0
  311. melage/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
  312. melage/resource/theme/rc/checkbox_unchecked_pressed0.png +0 -0
  313. melage/resource/theme/rc/checkbox_unchecked_pressed00.png +0 -0
  314. melage/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
  315. melage/resource/theme/rc/checkbox_unchecked_pressed@2x0.png +0 -0
  316. melage/resource/theme/rc/checkbox_unchecked_pressed@2x00.png +0 -0
  317. melage/resource/theme/rc/line_horizontal.png +0 -0
  318. melage/resource/theme/rc/line_horizontal@2x.png +0 -0
  319. melage/resource/theme/rc/line_horizontal_disabled.png +0 -0
  320. melage/resource/theme/rc/line_horizontal_disabled@2x.png +0 -0
  321. melage/resource/theme/rc/line_horizontal_focus.png +0 -0
  322. melage/resource/theme/rc/line_horizontal_focus@2x.png +0 -0
  323. melage/resource/theme/rc/line_horizontal_pressed.png +0 -0
  324. melage/resource/theme/rc/line_horizontal_pressed@2x.png +0 -0
  325. melage/resource/theme/rc/line_vertical.png +0 -0
  326. melage/resource/theme/rc/line_vertical@2x.png +0 -0
  327. melage/resource/theme/rc/line_vertical_disabled.png +0 -0
  328. melage/resource/theme/rc/line_vertical_disabled@2x.png +0 -0
  329. melage/resource/theme/rc/line_vertical_focus.png +0 -0
  330. melage/resource/theme/rc/line_vertical_focus@2x.png +0 -0
  331. melage/resource/theme/rc/line_vertical_pressed.png +0 -0
  332. melage/resource/theme/rc/line_vertical_pressed@2x.png +0 -0
  333. melage/resource/theme/rc/radio_checked.png +0 -0
  334. melage/resource/theme/rc/radio_checked@2x.png +0 -0
  335. melage/resource/theme/rc/radio_checked_disabled.png +0 -0
  336. melage/resource/theme/rc/radio_checked_disabled@2x.png +0 -0
  337. melage/resource/theme/rc/radio_checked_focus.png +0 -0
  338. melage/resource/theme/rc/radio_checked_focus@2x.png +0 -0
  339. melage/resource/theme/rc/radio_checked_pressed.png +0 -0
  340. melage/resource/theme/rc/radio_checked_pressed@2x.png +0 -0
  341. melage/resource/theme/rc/radio_unchecked.png +0 -0
  342. melage/resource/theme/rc/radio_unchecked@2x.png +0 -0
  343. melage/resource/theme/rc/radio_unchecked_disabled.png +0 -0
  344. melage/resource/theme/rc/radio_unchecked_disabled@2x.png +0 -0
  345. melage/resource/theme/rc/radio_unchecked_focus.png +0 -0
  346. melage/resource/theme/rc/radio_unchecked_focus@2x.png +0 -0
  347. melage/resource/theme/rc/radio_unchecked_pressed.png +0 -0
  348. melage/resource/theme/rc/radio_unchecked_pressed@2x.png +0 -0
  349. melage/resource/theme/rc/toolbar_move_horizontal.png +0 -0
  350. melage/resource/theme/rc/toolbar_move_horizontal@2x.png +0 -0
  351. melage/resource/theme/rc/toolbar_move_horizontal_disabled.png +0 -0
  352. melage/resource/theme/rc/toolbar_move_horizontal_disabled@2x.png +0 -0
  353. melage/resource/theme/rc/toolbar_move_horizontal_focus.png +0 -0
  354. melage/resource/theme/rc/toolbar_move_horizontal_focus@2x.png +0 -0
  355. melage/resource/theme/rc/toolbar_move_horizontal_pressed.png +0 -0
  356. melage/resource/theme/rc/toolbar_move_horizontal_pressed@2x.png +0 -0
  357. melage/resource/theme/rc/toolbar_move_vertical.png +0 -0
  358. melage/resource/theme/rc/toolbar_move_vertical@2x.png +0 -0
  359. melage/resource/theme/rc/toolbar_move_vertical_disabled.png +0 -0
  360. melage/resource/theme/rc/toolbar_move_vertical_disabled@2x.png +0 -0
  361. melage/resource/theme/rc/toolbar_move_vertical_focus.png +0 -0
  362. melage/resource/theme/rc/toolbar_move_vertical_focus@2x.png +0 -0
  363. melage/resource/theme/rc/toolbar_move_vertical_pressed.png +0 -0
  364. melage/resource/theme/rc/toolbar_move_vertical_pressed@2x.png +0 -0
  365. melage/resource/theme/rc/toolbar_separator_horizontal.png +0 -0
  366. melage/resource/theme/rc/toolbar_separator_horizontal@2x.png +0 -0
  367. melage/resource/theme/rc/toolbar_separator_horizontal_disabled.png +0 -0
  368. melage/resource/theme/rc/toolbar_separator_horizontal_disabled@2x.png +0 -0
  369. melage/resource/theme/rc/toolbar_separator_horizontal_focus.png +0 -0
  370. melage/resource/theme/rc/toolbar_separator_horizontal_focus@2x.png +0 -0
  371. melage/resource/theme/rc/toolbar_separator_horizontal_pressed.png +0 -0
  372. melage/resource/theme/rc/toolbar_separator_horizontal_pressed@2x.png +0 -0
  373. melage/resource/theme/rc/toolbar_separator_vertical.png +0 -0
  374. melage/resource/theme/rc/toolbar_separator_vertical@2x.png +0 -0
  375. melage/resource/theme/rc/toolbar_separator_vertical_disabled.png +0 -0
  376. melage/resource/theme/rc/toolbar_separator_vertical_disabled@2x.png +0 -0
  377. melage/resource/theme/rc/toolbar_separator_vertical_focus.png +0 -0
  378. melage/resource/theme/rc/toolbar_separator_vertical_focus@2x.png +0 -0
  379. melage/resource/theme/rc/toolbar_separator_vertical_pressed.png +0 -0
  380. melage/resource/theme/rc/toolbar_separator_vertical_pressed@2x.png +0 -0
  381. melage/resource/theme/rc/transparent.png +0 -0
  382. melage/resource/theme/rc/transparent@2x.png +0 -0
  383. melage/resource/theme/rc/transparent_disabled.png +0 -0
  384. melage/resource/theme/rc/transparent_disabled@2x.png +0 -0
  385. melage/resource/theme/rc/transparent_focus.png +0 -0
  386. melage/resource/theme/rc/transparent_focus@2x.png +0 -0
  387. melage/resource/theme/rc/transparent_pressed.png +0 -0
  388. melage/resource/theme/rc/transparent_pressed@2x.png +0 -0
  389. melage/resource/theme/rc/window_close.png +0 -0
  390. melage/resource/theme/rc/window_close@2x.png +0 -0
  391. melage/resource/theme/rc/window_close_disabled.png +0 -0
  392. melage/resource/theme/rc/window_close_disabled@2x.png +0 -0
  393. melage/resource/theme/rc/window_close_focus.png +0 -0
  394. melage/resource/theme/rc/window_close_focus@2x.png +0 -0
  395. melage/resource/theme/rc/window_close_pressed.png +0 -0
  396. melage/resource/theme/rc/window_close_pressed@2x.png +0 -0
  397. melage/resource/theme/rc/window_grip.png +0 -0
  398. melage/resource/theme/rc/window_grip@2x.png +0 -0
  399. melage/resource/theme/rc/window_grip_disabled.png +0 -0
  400. melage/resource/theme/rc/window_grip_disabled@2x.png +0 -0
  401. melage/resource/theme/rc/window_grip_focus.png +0 -0
  402. melage/resource/theme/rc/window_grip_focus@2x.png +0 -0
  403. melage/resource/theme/rc/window_grip_pressed.png +0 -0
  404. melage/resource/theme/rc/window_grip_pressed@2x.png +0 -0
  405. melage/resource/theme/rc/window_minimize.png +0 -0
  406. melage/resource/theme/rc/window_minimize@2x.png +0 -0
  407. melage/resource/theme/rc/window_minimize_disabled.png +0 -0
  408. melage/resource/theme/rc/window_minimize_disabled@2x.png +0 -0
  409. melage/resource/theme/rc/window_minimize_focus.png +0 -0
  410. melage/resource/theme/rc/window_minimize_focus@2x.png +0 -0
  411. melage/resource/theme/rc/window_minimize_pressed.png +0 -0
  412. melage/resource/theme/rc/window_minimize_pressed@2x.png +0 -0
  413. melage/resource/theme/rc/window_undock.png +0 -0
  414. melage/resource/theme/rc/window_undock@2x.png +0 -0
  415. melage/resource/theme/rc/window_undock_disabled.png +0 -0
  416. melage/resource/theme/rc/window_undock_disabled@2x.png +0 -0
  417. melage/resource/theme/rc/window_undock_focus.png +0 -0
  418. melage/resource/theme/rc/window_undock_focus@2x.png +0 -0
  419. melage/resource/theme/rc/window_undock_pressed.png +0 -0
  420. melage/resource/theme/rc/window_undock_pressed@2x.png +0 -0
  421. melage/resource/theme/style.qss +2223 -0
  422. melage/resource/tract.png +0 -0
  423. melage/resource/view1.png +0 -0
  424. melage/resource/view1_eco.png +0 -0
  425. melage/resource/view1_mri.png +0 -0
  426. melage/resource/view1_seg.png +0 -0
  427. melage/resource/view2.png +0 -0
  428. melage/resource/view2_seg.png +0 -0
  429. melage/resource/w.png +0 -0
  430. melage/resource/zoom_in.png +0 -0
  431. melage/resource/zoom_inFaded.png +0 -0
  432. melage/resource/zoom_out.png +0 -0
  433. melage/resource/zoom_outFaded.png +0 -0
  434. melage/some_notes.txt +3 -0
  435. melage/utils/DispalyIm.py +2788 -0
  436. melage/utils/GMM.py +720 -0
  437. melage/utils/Shaders_120.py +257 -0
  438. melage/utils/Shaders_330.py +314 -0
  439. melage/utils/Shaders_bu.py +314 -0
  440. melage/utils/__init__0.py +7 -0
  441. melage/utils/brain_extraction_helper.py +234 -0
  442. melage/utils/custom_QScrollBar.py +61 -0
  443. melage/utils/glScientific.py +1554 -0
  444. melage/utils/glScientific_bc.py +1585 -0
  445. melage/utils/readData.py +1061 -0
  446. melage/utils/registration.py +512 -0
  447. melage/utils/source_folder.py +18 -0
  448. melage/utils/utils.py +3808 -0
  449. melage/version.txt +1 -0
  450. melage/widgets/ApplyMask.py +212 -0
  451. melage/widgets/ChangeSystem.py +152 -0
  452. melage/widgets/DeepLModels/InfantSegment/Unet.py +464 -0
  453. melage/widgets/DeepLModels/NPP/dataset/mri_dataset_affine.py +149 -0
  454. melage/widgets/DeepLModels/NPP/models/checkpoints/npp_v1.pth.py +0 -0
  455. melage/widgets/DeepLModels/NPP/models/losses.py +146 -0
  456. melage/widgets/DeepLModels/NPP/models/model.py +272 -0
  457. melage/widgets/DeepLModels/NPP/models/utils.py +303 -0
  458. melage/widgets/DeepLModels/NPP/npp.py +116 -0
  459. melage/widgets/DeepLModels/NPP/requirements.txt +8 -0
  460. melage/widgets/DeepLModels/NPP/train/train.py +116 -0
  461. melage/widgets/DeepLModels/Unet3DAtt.py +657 -0
  462. melage/widgets/DeepLModels/Unet3D_basic.py +648 -0
  463. melage/widgets/DeepLModels/new_unet.py +652 -0
  464. melage/widgets/DeepLModels/new_unet_old.py +639 -0
  465. melage/widgets/DeepLModels/new_unet_old2.py +658 -0
  466. melage/widgets/HistImage.py +153 -0
  467. melage/widgets/ImageThresholding.py +222 -0
  468. melage/widgets/MaskOperations.py +147 -0
  469. melage/widgets/N4Dialog.py +241 -0
  470. melage/widgets/Segmentation/FCM.py +1553 -0
  471. melage/widgets/Segmentation/__init__.py +588 -0
  472. melage/widgets/Segmentation/utils.py +417 -0
  473. melage/widgets/SemiAutoSeg.py +666 -0
  474. melage/widgets/Synthstrip.py +141 -0
  475. melage/widgets/__init__0.py +5 -0
  476. melage/widgets/about.py +246 -0
  477. melage/widgets/activation.py +437 -0
  478. melage/widgets/activator.py +147 -0
  479. melage/widgets/be_dl.py +409 -0
  480. melage/widgets/be_dl_unet3d.py +441 -0
  481. melage/widgets/brain_extraction.py +855 -0
  482. melage/widgets/brain_extraction_dl.py +887 -0
  483. melage/widgets/brain_extraction_dl_bu.py +869 -0
  484. melage/widgets/colorwidget.py +100 -0
  485. melage/widgets/dockWidgets.py +2005 -0
  486. melage/widgets/enhanceImWidget.py +109 -0
  487. melage/widgets/fileDialog_widget.py +275 -0
  488. melage/widgets/iminfo.py +346 -0
  489. melage/widgets/mainwindow_widget.py +6775 -0
  490. melage/widgets/melageAbout.py +123 -0
  491. melage/widgets/openglWidgets.py +556 -0
  492. melage/widgets/registrationWidget.py +342 -0
  493. melage/widgets/repeat_widget.py +74 -0
  494. melage/widgets/screenshot_widget.py +138 -0
  495. melage/widgets/settings_widget.py +77 -0
  496. melage/widgets/tranformationWidget.py +275 -0
  497. melage-0.0.65.dist-info/METADATA +742 -0
  498. melage-0.0.65.dist-info/RECORD +501 -0
  499. melage-0.0.65.dist-info/WHEEL +5 -0
  500. melage-0.0.65.dist-info/entry_points.txt +2 -0
  501. melage-0.0.65.dist-info/top_level.txt +1 -0
melage/utils/GMM.py ADDED
@@ -0,0 +1,720 @@
1
+ import numpy as np
2
+ from scipy.special import logsumexp
3
+ from scipy import linalg
4
+ from sklearn.cluster import KMeans
5
+ """
6
+ GMM has been used from
7
+ https://atavory.github.io/ibex/_modules/sklearn/mixture/gaussian_mixture.html
8
+ with some modification
9
+ """
10
+
11
+ def _check_precision_positivity(precision, covariance_type):
12
+ """Check a precision vector is positive-definite."""
13
+ if np.any(np.less_equal(precision, 0.0)):
14
+ raise ValueError("'%s precision' should be "
15
+ "positive" % covariance_type)
16
+
17
+
18
+ def _check_precision_matrix(precision, covariance_type):
19
+ """Check a precision matrix is symmetric and positive-definite."""
20
+ if not (np.allclose(precision, precision.T) and
21
+ np.all(linalg.eigvalsh(precision) > 0.)):
22
+ raise ValueError("'%s precision' should be symmetric, "
23
+ "positive-definite" % covariance_type)
24
+
25
+
26
+ def _check_precisions_full(precisions, covariance_type):
27
+ """Check the precision matrices are symmetric and positive-definite."""
28
+ for prec in precisions:
29
+ _check_precision_matrix(prec, covariance_type)
30
+
31
+
32
+
33
+
34
+ ###############################################################################
35
+ # Gaussian mixture parameters estimators (used by the M-Step)
36
+
37
+
38
+
39
+ class GaussianMixture(object):
40
+ """Gaussian Mixture.
41
+
42
+ Representation of a Gaussian mixture model probability distribution.
43
+ This class allows to estimate the parameters of a Gaussian mixture
44
+ distribution.
45
+
46
+ Read more in the :ref:`User Guide <gmm>`.
47
+
48
+ .. versionadded:: 0.18
49
+
50
+ Parameters
51
+ ----------
52
+ n_components : int, default=1
53
+ The number of mixture components.
54
+
55
+ covariance_type : {'full', 'tied', 'diag', 'spherical'}, default='full'
56
+ String describing the type of covariance parameters to use.
57
+ Must be one of:
58
+
59
+ 'full'
60
+ each component has its own general covariance matrix
61
+ 'tied'
62
+ all components share the same general covariance matrix
63
+ 'diag'
64
+ each component has its own diagonal covariance matrix
65
+ 'spherical'
66
+ each component has its own single variance
67
+
68
+ tol : float, default=1e-3
69
+ The convergence threshold. EM iterations will stop when the
70
+ lower bound average gain is below this threshold.
71
+
72
+ reg_covar : float, default=1e-6
73
+ Non-negative regularization added to the diagonal of covariance.
74
+ Allows to assure that the covariance matrices are all positive.
75
+
76
+ max_iter : int, default=100
77
+ The number of EM iterations to perform.
78
+
79
+ n_init : int, default=1
80
+ The number of initializations to perform. The best results are kept.
81
+
82
+ init_params : {'kmeans', 'random'}, default='kmeans'
83
+ The method used to initialize the weights, the means and the
84
+ precisions.
85
+ Must be one of::
86
+
87
+ 'kmeans' : responsibilities are initialized using kmeans.
88
+ 'random' : responsibilities are initialized randomly.
89
+
90
+ weights_init : array-like of shape (n_components, ), default=None
91
+ The user-provided initial weights.
92
+ If it is None, weights are initialized using the `init_params` method.
93
+
94
+ means_init : array-like of shape (n_components, n_features), default=None
95
+ The user-provided initial means,
96
+ If it is None, means are initialized using the `init_params` method.
97
+
98
+ precisions_init : array-like, default=None
99
+ The user-provided initial precisions (inverse of the covariance
100
+ matrices).
101
+ If it is None, precisions are initialized using the 'init_params'
102
+ method.
103
+ The shape depends on 'covariance_type'::
104
+
105
+ (n_components,) if 'spherical',
106
+ (n_features, n_features) if 'tied',
107
+ (n_components, n_features) if 'diag',
108
+ (n_components, n_features, n_features) if 'full'
109
+
110
+ random_state : int, RandomState instance or None, default=None
111
+ Controls the random seed given to the method chosen to initialize the
112
+ parameters (see `init_params`).
113
+ In addition, it controls the generation of random samples from the
114
+ fitted distribution (see the method `sample`).
115
+ Pass an int for reproducible output across multiple function calls.
116
+ See :term:`Glossary <random_state>`.
117
+
118
+ warm_start : bool, default=False
119
+ If 'warm_start' is True, the solution of the last fitting is used as
120
+ initialization for the next call of fit(). This can speed up
121
+ convergence when fit is called several times on similar problems.
122
+ In that case, 'n_init' is ignored and only a single initialization
123
+ occurs upon the first call.
124
+ See :term:`the Glossary <warm_start>`.
125
+
126
+ verbose : int, default=0
127
+ Enable verbose output. If 1 then it prints the current
128
+ initialization and each iteration step. If greater than 1 then
129
+ it prints also the log probability and the time needed
130
+ for each step.
131
+
132
+ verbose_interval : int, default=10
133
+ Number of iteration done before the next print.
134
+
135
+ Attributes
136
+ ----------
137
+ weights_ : array-like of shape (n_components,)
138
+ The weights of each mixture components.
139
+
140
+ means_ : array-like of shape (n_components, n_features)
141
+ The mean of each mixture component.
142
+
143
+ covariances_ : array-like
144
+ The covariance of each mixture component.
145
+ The shape depends on `covariance_type`::
146
+
147
+ (n_components,) if 'spherical',
148
+ (n_features, n_features) if 'tied',
149
+ (n_components, n_features) if 'diag',
150
+ (n_components, n_features, n_features) if 'full'
151
+
152
+ precisions_ : array-like
153
+ The precision matrices for each component in the mixture. A precision
154
+ matrix is the inverse of a covariance matrix. A covariance matrix is
155
+ symmetric positive definite so the mixture of Gaussian can be
156
+ equivalently parameterized by the precision matrices. Storing the
157
+ precision matrices instead of the covariance matrices makes it more
158
+ efficient to compute the log-likelihood of new samples at test time.
159
+ The shape depends on `covariance_type`::
160
+
161
+ (n_components,) if 'spherical',
162
+ (n_features, n_features) if 'tied',
163
+ (n_components, n_features) if 'diag',
164
+ (n_components, n_features, n_features) if 'full'
165
+
166
+ precisions_cholesky_ : array-like
167
+ The cholesky decomposition of the precision matrices of each mixture
168
+ component. A precision matrix is the inverse of a covariance matrix.
169
+ A covariance matrix is symmetric positive definite so the mixture of
170
+ Gaussian can be equivalently parameterized by the precision matrices.
171
+ Storing the precision matrices instead of the covariance matrices makes
172
+ it more efficient to compute the log-likelihood of new samples at test
173
+ time. The shape depends on `covariance_type`::
174
+
175
+ (n_components,) if 'spherical',
176
+ (n_features, n_features) if 'tied',
177
+ (n_components, n_features) if 'diag',
178
+ (n_components, n_features, n_features) if 'full'
179
+
180
+ converged_ : bool
181
+ True when convergence was reached in fit(), False otherwise.
182
+
183
+ n_iter_ : int
184
+ Number of step used by the best fit of EM to reach the convergence.
185
+
186
+ lower_bound_ : float
187
+ Lower bound value on the log-likelihood (of the training data with
188
+ respect to the model) of the best fit of EM.
189
+
190
+ Examples
191
+ --------
192
+ >>> import numpy as np
193
+ >>> from sklearn.mixture import GaussianMixture
194
+ >>> X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])
195
+ >>> gm = GaussianMixture(n_components=2, random_state=0).fit(X)
196
+ >>> gm.means_
197
+ array([[10., 2.],
198
+ [ 1., 2.]])
199
+ >>> gm.predict([[0, 0], [12, 3]])
200
+ array([1, 0])
201
+
202
+ See Also
203
+ --------
204
+ BayesianGaussianMixture : Gaussian mixture model fit with a variational
205
+ inference.
206
+ """
207
+ #@_deprecate_positional_args
208
+ def __init__(self, n_components=1, *, covariance_type='full', tol=1e-3,
209
+ reg_covar=1e-6, max_iter=100, n_init=1, init_params='kmeans',
210
+ weights_init=None, means_init=None, precisions_init=None,
211
+ random_state=None, warm_start=False,
212
+ verbose=0, verbose_interval=10):
213
+ # super().__init__(
214
+ # n_components=n_components, tol=tol, reg_covar=reg_covar,
215
+ # max_iter=max_iter, n_init=n_init, init_params=init_params,
216
+ # random_state=random_state, warm_start=warm_start,
217
+ # verbose=verbose, verbose_interval=verbose_interval)
218
+
219
+ self.covariance_type = covariance_type
220
+ self.weights_init = weights_init
221
+ self.means_init = means_init
222
+ self.precisions_init = precisions_init
223
+
224
+ self.n_components = n_components
225
+ self.tol = tol
226
+ self.reg_covar = reg_covar
227
+ self.max_iter = max_iter
228
+ self.n_init = n_init
229
+ self.init_params = init_params
230
+ self.random_state = random_state
231
+ self.warm_start = warm_start
232
+ self.verbose = verbose
233
+ self.verbose_interval = verbose_interval
234
+
235
+ def _estimate_gaussian_covariances_full(self, resp, X, nk, means, reg_covar):
236
+ """Estimate the full covariance matrices.
237
+
238
+ Parameters
239
+ ----------
240
+ resp : array-like of shape (n_samples, n_components)
241
+
242
+ X : array-like of shape (n_samples, n_features)
243
+
244
+ nk : array-like of shape (n_components,)
245
+
246
+ means : array-like of shape (n_components, n_features)
247
+
248
+ reg_covar : float
249
+
250
+ Returns
251
+ -------
252
+ covariances : array, shape (n_components, n_features, n_features)
253
+ The covariance matrix of the current components.
254
+ """
255
+ n_components, n_features = means.shape
256
+ covariances = np.empty((n_components, n_features, n_features))
257
+ for k in range(n_components):
258
+ diff = X - means[k]
259
+ covariances[k] = np.dot(resp[:, k] * diff.T, diff) / nk[k]
260
+ covariances[k].flat[::n_features + 1] += reg_covar
261
+ return covariances
262
+
263
+
264
+
265
+ def _estimate_gaussian_covariances_diag(self, resp, X, nk, means, reg_covar):
266
+ """Estimate the diagonal covariance vectors.
267
+
268
+ Parameters
269
+ ----------
270
+ responsibilities : array-like of shape (n_samples, n_components)
271
+
272
+ X : array-like of shape (n_samples, n_features)
273
+
274
+ nk : array-like of shape (n_components,)
275
+
276
+ means : array-like of shape (n_components, n_features)
277
+
278
+ reg_covar : float
279
+
280
+ Returns
281
+ -------
282
+ covariances : array, shape (n_components, n_features)
283
+ The covariance vector of the current components.
284
+ """
285
+ #X = X * self._counts
286
+ avg_X2 = np.dot((resp).T, (X * X*self._counts) ) / nk[:, np.newaxis]
287
+ avg_means2 = means ** 2
288
+ avg_X_means = means * np.dot(resp.T, X*self._counts) / nk[:, np.newaxis]
289
+ return avg_X2 - 2 * avg_X_means + avg_means2 + reg_covar
290
+
291
+
292
+ def _estimate_gaussian_parameters(self, X, resp, reg_covar, covariance_type):
293
+ """Estimate the Gaussian distribution parameters.
294
+
295
+ Parameters
296
+ ----------
297
+ X : array-like of shape (n_samples, n_features)
298
+ The input data array.
299
+
300
+ resp : array-like of shape (n_samples, n_components)
301
+ The responsibilities for each data sample in X.
302
+
303
+ reg_covar : float
304
+ The regularization added to the diagonal of the covariance matrices.
305
+
306
+ covariance_type : {'full', 'tied', 'diag', 'spherical'}
307
+ The type of precision matrices.
308
+
309
+ Returns
310
+ -------
311
+ nk : array-like of shape (n_components,)
312
+ The numbers of data samples in the current components.
313
+
314
+ means : array-like of shape (n_components, n_features)
315
+ The centers of the current components.
316
+
317
+ covariances : array-like
318
+ The covariance matrix of the current components.
319
+ The shape depends of the covariance_type.
320
+ """
321
+ nk = (resp*self._counts).sum(axis=0) + 10 * np.finfo(resp.dtype).eps
322
+ means = np.dot(resp.T, X*self._counts)/nk[:,np.newaxis]
323
+ covariances = {"diag": self._estimate_gaussian_covariances_diag
324
+ }[covariance_type](resp, X, nk, means, reg_covar)
325
+ return nk, means, covariances
326
+
327
+ def _compute_precision_cholesky(self, covariances, covariance_type):
328
+ """Compute the Cholesky decomposition of the precisions.
329
+
330
+ Parameters
331
+ ----------
332
+ covariances : array-like
333
+ The covariance matrix of the current components.
334
+ The shape depends of the covariance_type.
335
+
336
+ covariance_type : {'full', 'tied', 'diag', 'spherical'}
337
+ The type of precision matrices.
338
+
339
+ Returns
340
+ -------
341
+ precisions_cholesky : array-like
342
+ The cholesky decomposition of sample precisions of the current
343
+ components. The shape depends of the covariance_type.
344
+ """
345
+ estimate_precision_error_message = (
346
+ "Fitting the mixture model failed because some components have "
347
+ "ill-defined empirical covariance (for instance caused by singleton "
348
+ "or collapsed samples). Try to decrease the number of components, "
349
+ "or increase reg_covar.")
350
+
351
+ if covariance_type == 'full':
352
+ n_components, n_features, _ = covariances.shape
353
+ precisions_chol = np.empty((n_components, n_features, n_features))
354
+ for k, covariance in enumerate(covariances):
355
+ try:
356
+ cov_chol = linalg.cholesky(covariance, lower=True)
357
+ except linalg.LinAlgError:
358
+ raise ValueError(estimate_precision_error_message)
359
+ precisions_chol[k] = linalg.solve_triangular(cov_chol,
360
+ np.eye(n_features),
361
+ lower=True).T
362
+ elif covariance_type == 'tied':
363
+ _, n_features = covariances.shape
364
+ try:
365
+ cov_chol = linalg.cholesky(covariances, lower=True)
366
+ except linalg.LinAlgError:
367
+ raise ValueError(estimate_precision_error_message)
368
+ precisions_chol = linalg.solve_triangular(cov_chol, np.eye(n_features),
369
+ lower=True).T
370
+ else:
371
+ if np.any(np.less_equal(covariances, 0.0)):
372
+ raise ValueError(estimate_precision_error_message)
373
+ precisions_chol = 1. / np.sqrt(covariances)
374
+ return precisions_chol
375
+
376
+ ###############################################################################
377
+ # Gaussian mixture probability estimators
378
+ def _compute_log_det_cholesky(self, matrix_chol, covariance_type, n_features):
379
+ """Compute the log-det of the cholesky decomposition of matrices.
380
+ """
381
+
382
+ if covariance_type == 'diag':
383
+ log_det_chol = (np.sum(np.log(matrix_chol), axis=1))
384
+
385
+
386
+ return log_det_chol
387
+
388
+ def _estimate_log_gaussian_prob(self, X, means, precisions_chol, covariance_type):
389
+ """Estimate the log Gaussian probability.
390
+
391
+ Parameters
392
+ ----------
393
+ X : array-like of shape (n_samples, n_features)
394
+
395
+ means : array-like of shape (n_components, n_features)
396
+
397
+ precisions_chol : array-like
398
+ Cholesky decompositions of the precision matrices.
399
+ 'full' : shape of (n_components, n_features, n_features)
400
+ 'tied' : shape of (n_features, n_features)
401
+ 'diag' : shape of (n_components, n_features)
402
+ 'spherical' : shape of (n_components,)
403
+
404
+ covariance_type : {'full', 'tied', 'diag', 'spherical'}
405
+
406
+ Returns
407
+ -------
408
+ log_prob : array, shape (n_samples, n_components)
409
+ """
410
+ _, n_features = X.shape
411
+ n_components, _ = means.shape
412
+ # det(precision_chol) is half of det(precision)
413
+ log_det = self._compute_log_det_cholesky(
414
+ precisions_chol, covariance_type, n_features)
415
+
416
+
417
+ if covariance_type == 'diag':
418
+ precisions = precisions_chol ** 2
419
+ #if self._counts is not None:
420
+ # X = X*self._counts
421
+ log_prob = (np.sum((means ** 2 * precisions), 1) -
422
+ 2. * np.dot(X, (means * precisions).T) +
423
+ np.dot(X ** 2, precisions.T))
424
+ if self._counts is not None:
425
+ log_prob *= self._counts
426
+
427
+ return -.5 * (n_features * np.log(2 * np.pi) + log_prob) + log_det
428
+
429
+ def fit(self, X, y=None, counts = None, total_data_kmeans=None):
430
+ """Estimate model parameters with the EM algorithm.
431
+ """
432
+ if counts is not None:
433
+ self._counts = counts.reshape(-1,1)
434
+ self._total_data_kmeans = total_data_kmeans
435
+ self.fit_predict(X, y, counts)
436
+ self._counts = None
437
+ return self
438
+
439
+ def score_samples(self, X):
440
+ """Compute the weighted log probabilities for each sample.
441
+
442
+ """
443
+
444
+
445
+ return logsumexp(self._estimate_weighted_log_prob(X), axis=1)
446
+
447
+ def _print_verbose_msg_init_beg(self, n_init):
448
+ """Print verbose message on initialization."""
449
+ if self.verbose == 1:
450
+ print("Initialization %d" % n_init)
451
+ elif self.verbose >= 2:
452
+ print("Initialization %d" % n_init)
453
+ self._init_prev_time = time()
454
+ self._iter_prev_time = self._init_prev_time
455
+
456
+
457
+
458
+ def _print_verbose_msg_iter_end(self, n_iter, diff_ll):
459
+ """Print verbose message on initialization."""
460
+ if n_iter % self.verbose_interval == 0:
461
+ if self.verbose == 1:
462
+ print(" Iteration %d" % n_iter)
463
+ elif self.verbose >= 2:
464
+ cur_time = time()
465
+ print(" Iteration %d\t time lapse %.5fs\t ll change %.5f" % (
466
+ n_iter, cur_time - self._iter_prev_time, diff_ll))
467
+ self._iter_prev_time = cur_time
468
+
469
+
470
+ def _initialize_parameters(self, X, random_state):
471
+ """Initialize the model parameters.
472
+
473
+ Parameters
474
+ ----------
475
+ X : array-like of shape (n_samples, n_features)
476
+
477
+ random_state : RandomState
478
+ A random number generator instance that controls the random seed
479
+ used for the method chosen to initialize the parameters.
480
+ """
481
+ n_samples, _ = X.shape
482
+
483
+ if self.init_params == 'kmeans':
484
+ resp = np.zeros((n_samples, self.n_components))
485
+ km = KMeans(n_clusters=self.n_components, n_init=1,
486
+ random_state=random_state).fit(self._total_data_kmeans)
487
+ label = km.predict(X)
488
+ resp[np.arange(n_samples), label] = 1
489
+ elif self.init_params == 'random':
490
+ resp = random_state.rand(n_samples, self.n_components)
491
+ resp /= resp.sum(axis=1)[:, np.newaxis]
492
+ else:
493
+ raise ValueError("Unimplemented initialization method '%s'"
494
+ % self.init_params)
495
+
496
+ self._initialize(X, resp)
497
+
498
+ def _print_verbose_msg_init_end(self, ll):
499
+ """Print verbose message on the end of iteration."""
500
+ if self.verbose == 1:
501
+ print("Initialization converged: %s" % self.converged_)
502
+ elif self.verbose >= 2:
503
+ print("Initialization converged: %s\t time lapse %.5fs\t ll %.5f" %
504
+ (self.converged_, time() - self._init_prev_time, ll))
505
+
506
+
507
+ def fit_predict(self, X, y=None, counts = None):
508
+ """Estimate model parameters using X and predict the labels for X.
509
+ """
510
+ #X = _check_X(X, self.n_components, ensure_min_samples=2)
511
+ #self._check_n_features(X, reset=True)
512
+ #self._check_initial_parameters(X)
513
+
514
+ # if we enable warm_start, we will have a unique initialisation
515
+ do_init = not(self.warm_start and hasattr(self, 'converged_'))
516
+ n_init = self.n_init if do_init else 1
517
+
518
+ max_lower_bound = -np.infty
519
+ self.converged_ = False
520
+
521
+ random_state = np.random.RandomState(self.random_state)
522
+
523
+ n_samples, _ = X.shape
524
+ for init in range(n_init):
525
+ self._print_verbose_msg_init_beg(init)
526
+
527
+ if do_init:
528
+ self._initialize_parameters(X, random_state)
529
+
530
+ lower_bound = (-np.infty if do_init else self.lower_bound_)
531
+
532
+ for n_iter in range(1, self.max_iter + 1):
533
+ prev_lower_bound = lower_bound
534
+
535
+ log_prob_norm, log_resp = self._e_step(X, counts=counts)
536
+ self._m_step(X, log_resp)
537
+ lower_bound = self._compute_lower_bound(
538
+ log_resp, log_prob_norm)
539
+
540
+ change = lower_bound - prev_lower_bound
541
+ self._print_verbose_msg_iter_end(n_iter, change)
542
+
543
+ if abs(change) < self.tol:
544
+ self.converged_ = True
545
+ break
546
+
547
+ self._print_verbose_msg_init_end(lower_bound)
548
+
549
+ if lower_bound > max_lower_bound:
550
+ max_lower_bound = lower_bound
551
+ best_params = self._get_parameters()
552
+ best_n_iter = n_iter
553
+
554
+ if not self.converged_:
555
+ print('Initialization %d did not converge. '
556
+ 'Try different init parameters, '
557
+ 'or increase max_iter, tol '
558
+ 'or check for degenerate data.'
559
+ % (init + 1))
560
+
561
+ self._set_parameters(best_params)
562
+ self.n_iter_ = best_n_iter
563
+ self.lower_bound_ = max_lower_bound
564
+
565
+ # Always do a final e-step to guarantee that the labels returned by
566
+ # fit_predict(X) are always consistent with fit(X).predict(X)
567
+ # for any value of max_iter and tol (and any random_state).
568
+ _, log_resp = self._e_step(X)
569
+
570
+ return log_resp.argmax(axis=1)
571
+
572
+ def _e_step(self, X, counts=None):
573
+ """E step.
574
+ """
575
+ log_prob_norm, log_resp = self._estimate_log_prob_resp(X)
576
+ return log_prob_norm.sum()/self._counts.sum(), log_resp
577
+
578
+ def _estimate_log_prob_resp(self, X):
579
+ """Estimate log probabilities and responsibilities for each sample.
580
+ """
581
+ weighted_log_prob = self._estimate_weighted_log_prob(X)
582
+ #if self._counts is not None:
583
+ # weighted_log_prob = self._counts * weighted_log_prob
584
+ log_prob_norm = logsumexp(weighted_log_prob, axis=1)
585
+ with np.errstate(under='ignore'):
586
+ # ignore underflow
587
+ log_resp = weighted_log_prob - log_prob_norm[:, np.newaxis]
588
+ return log_prob_norm, log_resp
589
+
590
+ def _estimate_weighted_log_prob(self, X):
591
+ """Estimate the weighted log-probabilities, log P(X | Z) + log weights.
592
+ """
593
+ return self._estimate_log_prob(X) + self._estimate_log_weights()
594
+
595
+ def _initialize(self, X, resp):
596
+ """Initialization of the Gaussian mixture parameters.
597
+
598
+ Parameters
599
+ ----------
600
+ X : array-like of shape (n_samples, n_features)
601
+
602
+ resp : array-like of shape (n_samples, n_components)
603
+ """
604
+ n_samples= self._counts.sum()#X.shape
605
+
606
+ weights, means, covariances = self._estimate_gaussian_parameters(
607
+ X, resp, self.reg_covar, self.covariance_type)
608
+ weights /= n_samples
609
+
610
+ self.weights_ = (weights if self.weights_init is None
611
+ else self.weights_init)
612
+ self.means_ = means if self.means_init is None else self.means_init
613
+
614
+ if self.precisions_init is None:
615
+ self.covariances_ = covariances
616
+ self.precisions_cholesky_ = self._compute_precision_cholesky(
617
+ covariances, self.covariance_type)
618
+ elif self.covariance_type == 'full':
619
+ self.precisions_cholesky_ = np.array(
620
+ [linalg.cholesky(prec_init, lower=True)
621
+ for prec_init in self.precisions_init])
622
+ elif self.covariance_type == 'tied':
623
+ self.precisions_cholesky_ = linalg.cholesky(self.precisions_init,
624
+ lower=True)
625
+ else:
626
+ self.precisions_cholesky_ = self.precisions_init
627
+
628
+ def _m_step(self, X, log_resp):
629
+ """M step.
630
+
631
+ Parameters
632
+ ----------
633
+ X : array-like of shape (n_samples, n_features)
634
+
635
+ log_resp : array-like of shape (n_samples, n_components)
636
+ Logarithm of the posterior probabilities (or responsibilities) of
637
+ the point of each sample in X.
638
+ """
639
+ n_samples = self._counts.sum()#X.shape
640
+ self.weights_, self.means_, self.covariances_ = (
641
+ self._estimate_gaussian_parameters(X, np.exp(log_resp), self.reg_covar,
642
+ self.covariance_type))
643
+ self.weights_ /= n_samples
644
+ self.precisions_cholesky_ = self._compute_precision_cholesky(
645
+ self.covariances_, self.covariance_type)
646
+
647
+ def _estimate_log_prob(self, X):
648
+ return self._estimate_log_gaussian_prob(
649
+ X, self.means_, self.precisions_cholesky_, self.covariance_type)
650
+
651
+ def _estimate_log_weights(self):
652
+ return np.log(self.weights_)
653
+
654
+ def _compute_lower_bound(self, _, log_prob_norm):
655
+ return log_prob_norm
656
+
657
+ def _get_parameters(self):
658
+ return (self.weights_, self.means_, self.covariances_,
659
+ self.precisions_cholesky_)
660
+
661
+ def _set_parameters(self, params):
662
+ (self.weights_, self.means_, self.covariances_,
663
+ self.precisions_cholesky_) = params
664
+
665
+ # Attributes computation
666
+ _, n_features = self.means_.shape
667
+
668
+ if self.covariance_type == 'full':
669
+ self.precisions_ = np.empty(self.precisions_cholesky_.shape)
670
+ for k, prec_chol in enumerate(self.precisions_cholesky_):
671
+ self.precisions_[k] = np.dot(prec_chol, prec_chol.T)
672
+
673
+ elif self.covariance_type == 'tied':
674
+ self.precisions_ = np.dot(self.precisions_cholesky_,
675
+ self.precisions_cholesky_.T)
676
+ else:
677
+ self.precisions_ = self.precisions_cholesky_ ** 2
678
+
679
+ def _n_parameters(self):
680
+ """Return the number of free parameters in the model."""
681
+ _, n_features = self.means_.shape
682
+ if self.covariance_type == 'full':
683
+ cov_params = self.n_components * n_features * (n_features + 1) / 2.
684
+ elif self.covariance_type == 'diag':
685
+ cov_params = self.n_components * n_features
686
+ elif self.covariance_type == 'tied':
687
+ cov_params = n_features * (n_features + 1) / 2.
688
+ elif self.covariance_type == 'spherical':
689
+ cov_params = self.n_components
690
+ mean_params = n_features * self.n_components
691
+ return int(cov_params + mean_params + self.n_components - 1)
692
+
693
+ def bic(self, X):
694
+ """Bayesian information criterion for the current model on the input X.
695
+
696
+ Parameters
697
+ ----------
698
+ X : array of shape (n_samples, n_dimensions)
699
+
700
+ Returns
701
+ -------
702
+ bic : float
703
+ The lower the better.
704
+ """
705
+ return (-2 * self.score(X) * X.shape[0] +
706
+ self._n_parameters() * np.log(X.shape[0]))
707
+
708
+ def aic(self, X):
709
+ """Akaike information criterion for the current model on the input X.
710
+
711
+ Parameters
712
+ ----------
713
+ X : array of shape (n_samples, n_dimensions)
714
+
715
+ Returns
716
+ -------
717
+ aic : float
718
+ The lower the better.
719
+ """
720
+ return -2 * self.score(X) * X.shape[0] + 2 * self._n_parameters()