void CSummaryPage::OnEditSave() { CFileDialog dlg( FALSE, _T("log"), _T("Output"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Log Files (*.log)|*.log|All Files (*.*)|*.*||")); if(IDOK==dlg.DoModal()){ TRY { CStdioFile f( dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite ); CString str; int arColWidth[nCols]; for(int nCol=0;nCol<nCols;nCol++){ int &w=arColWidth[nCol]; w=_tcslen(arpszCols[nCol]); for(int nItem=0;nItem<m_List.GetItemCount();nItem++){ w=max(w,m_List.GetItemText(nItem,nCol).GetLength()); } TRACE(_T("max[%d]=%d\n"),nCol,w); } for(nCol=0;nCol<nCols;nCol++){ const CString &strItem=arpszCols[nCol]; str+=strItem; if(nCol<nCols-1){ CString strTab(_TCHAR(' '),1+arColWidth[nCol]-strItem.GetLength()); str+=strTab; } } str+=_TCHAR('\n'); f.WriteString(str); for(int nItem=0;nItem<m_List.GetItemCount();nItem++){ CString str; for(int nCol=0;nCol<nCols;nCol++){ const CString strItem=m_List.GetItemText(nItem,nCol); str+=strItem; if(nCol<nCols-1){ CString strTab(_TCHAR(' '),1+arColWidth[nCol]-strItem.GetLength()); str+=strTab; } } str+=_TCHAR('\n'); f.WriteString(str); } f.Close(); } CATCH( CFileException, e ) { MessageBox(_T("Failed to write file")); }
//computes kldiv between each pair of actual clusters and adds the min to CCluster::m_vInfo bool InterClustKLD(CCluster& Clusters,vector<KDTreeHist>& vDistribs,vector<int>& vClustIDs,vector<int>& vClustCounts,int iClusts,bool bFast,Neighbor** vnn,int WhichDraw,const CUPDUPDATA* pUp,int iNNToFind,vector<int>& vNCount,vector<float>& vFloat,int iRows,int iCols) { //kldiv cluster to other clusters int iC1 = 0, iC2 = 0, iTot = ((iClusts-1)*(iClusts-1)+iClusts-1)/2, iCurr = 0; try { CString msg; vector< vector<prob_t> > vcInfInter(iClusts+1, vector<prob_t>(iClusts+1)); Write2Log("Calculating inter-cluster KLDiv"); prob_t kldiv = 0.0f; if(Clusters.m_oCQO.m_bFindBestDims) //compute inter-clust kldiv using best dimensions { iTot = iClusts*iClusts; //distances are not symmetrical since use different dimensions for(iC1=1;iC1<=iClusts && !pUp->ShouldTerminate();iC1++) { for(iC2=1;iC2<=iClusts && !pUp->ShouldTerminate();iC2++,iCurr++) { if(iC2==iC1) continue; msg.Format("Calculating kldiv btwn clust %d and %d",iC1,iC2); pUp->SetProgress(msg,100*(iCurr/static_cast<double>(iTot))); Write2Log(msg); KDTreeHist oT; vector<float> vTmpData; //make temporary tree FillTree(vFloat,iRows,iCols,iC2,vClustCounts[iC2],vClustIDs,Clusters.m_vBestDims[iC1],Clusters.m_oCQO.m_iBestDims,oT,vTmpData); vcInfInter[iC1][iC2]=KLDivSym(vDistribs[iC1],oT); Write2Log("sym. kldiv from %d to %d = %.4f",iC1,iC2,vcInfInter[iC1][iC2]); } } } else { for(iC1=1;iC1<=iClusts && !pUp->ShouldTerminate();iC1++) { for(iC2=iC1+1;iC2<=iClusts && !pUp->ShouldTerminate();iC2++,iCurr++) { msg.Format("Calculating kldiv btwn clust %d and %d",iC1,iC2); pUp->SetProgress(msg,100*(iCurr/static_cast<double>(iTot))); Write2Log(msg); if(bFast) vcInfInter[iC1][iC2]=vcInfInter[iC2][iC1]=FastKLDivSymPQ(vDistribs[iC1],vDistribs[iC2],vnn,iC1,iC2,vClustIDs,iNNToFind,vNCount); else vcInfInter[iC1][iC2]=vcInfInter[iC2][iC1]=KLDivSym(vDistribs[iC1],vDistribs[iC2]); Write2Log("sym. kldiv from %d to %d = %.4f",iC1,iC2,vcInfInter[iC1][iC2]); } } } if(!pUp->ShouldTerminate()){ for(iC1=1;iC1<=iClusts;iC1++) { prob_t min_int = iClusts>1 ? INF : 0.0; //*INF; int min_ind = 0; if(iClusts>1) for(iC2=1;iC2<=iClusts;iC2++) { if(iC1==iC2 || vClustCounts[iC2]<2)continue; prob_t tmpK = vcInfInter[iC1][iC2]; if(tmpK<min_int) { min_int=tmpK; min_ind=iC2; } } Clusters.m_vInfo[WhichDraw][iC1].m_fInterClustGain = min_int; Clusters.m_vInfo[WhichDraw][iC1].m_iClosestID = min_ind; Write2Log("Nearest kldiv from clust %d to %d is %.6f",iC1,min_ind,min_int); } CString strTab("\ninter clust kldiv table\n") , strTmp;//write inter-cluster kldiv table to log for inspection... for(iC1=1;iC1<=iClusts;iC1++) { for(iC2=1;iC2<=iClusts;iC2++) { strTmp.Format("%.6f\t",vcInfInter[iC1][iC2]); strTab += strTmp; } strTab += "\n"; } Write2Log(strTab); } } catch(...) { Write2Log("Exception in InterClustKLD!!! iC1=%d iC2=%d iClusts=%d",iC1,iC2,iClusts); return false; } return true; }