program define compart2,rclass
version 9
syntax varlist [if] [in] [fweight iweight] [,part(numlist) type(string)]

preserve
unab varlist:`varlist'
di "`varlist'"
tokenize `varlist'
marksample touse
local nbvar:word count `varlist'
qui count
local nbind=r(N)
tempname p
qui gen `p'=1
qui su `p' [`weight'`exp'] if `touse'
local nbind=r(N)
if "`square'"=="" {
   local quad=1
}
else {
   local quad=2
}

if "`type'"=="" {
   local type classical
}
if "`type'"!="classical"&"`type'"!="centroid"&"`type'"!="polychoric" {
   di in red "The type of the matrix is not authorized. Please correct your {hi:type} option."
   error 198
}

/* DEFINITION OF THE PARTITION OF THE VARIABLES*/

local newpart
foreach i in `part' {
    if `i'!=0 {
       local newpart `newpart' `i'
    }
}
local part `newpart'
local meme=0
local diff=0
local nbpart:word count `part'
forvalues i=1/`nbpart' {
    local iti:word `i' of `part'
    local meme=`meme'+`iti'*(`iti'-1)/2
    forvalues j=`=`i'+1'/`nbpart' {
       local itj:word `j' of `part'
       local diff=`diff'+`iti'*`itj'
    }
}

local perc=`meme'/(`meme'+`diff')
di "meme: `meme' ; diff: `diff' ; perc: `perc'"


local test=0
local last0=0
forvalues i=1/`nbpart' {
   local first`i'=`last`=`i'-1''+1
   local size`i':word `i' of `part'
   local last`i'=`first`i''+`size`i''-1
   local test=`test'+`size`i''
   local list`i'
   forvalues j=`first`i''/`last`i'' {
      local list`i' `list`i'' ``j''
   }
}
if `test'!=`nbvar' {
   di in red "{p}The described partition of the variables is composed of a number of variables different of the number of variables of varlist.{p_end}"
   exit 198
}

forvalues g=1/`nbpart' {
   tempname f1`g'
   if `size`g''>1 {
      if "`type'"=="classical" {
          qui pca `list`g'',cov
          qui predict `f1`g''
      }
      else if "`type'"=="polychoric" {
         qui polychoricpca `list`g'',score(`f1`g'') nscore(1)
         rename `f1`g''1 `f1`g''
      }
      else if "`type'"=="centroid" {
         qui genscore `list`g'', score(`f1`g'') mean
      }
   }
   else if `size`g''==1 {
      qui gen `f1`g''=`list`g''
   }
}
local minrho=2
local maxrho=-2
forvalue i=1/`nbvar' {
   forvalues g=1/`nbpart' {
      qui corr ``i'' `f1`g''
      if `i'>=`first`g''&`i'<=`last`g'' {
         if r(rho)<`minrho' {
            local minrho=r(rho)
         }
      }
      else if r(rho)>`maxrho' {
         local maxrho=r(rho)
      }
   }
}

di "C=(`meme'*`minrho'-`diff'*`maxrho')/(`meme'+`diff')"
local C=(`meme'*`minrho'-`diff'*`maxrho')/(`meme'+`diff')
local C=(`meme'*`minrho'-`diff'*`maxrho')/(`meme'+`diff')
*local C=`minrho'
di "C= `C' min=`minrho' max=`maxrho'"

return local compart `C'
*return local mean `mean'
*return local list `varlist'
return local part `part'
restore
end