Esempio n. 1
0
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"));
	    }
Esempio n. 2
0
//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;
}