package dr.evomodel.speciation.ModelAveragingResearch; import java.util.ArrayList; /** * @author Walter Xie */ public class MAIndexResearch { int indexLen = 3; ArrayList<int[]> indexPatterns; int[] validPatterns; // max index int[] invalidPatterns; int index; final int testI = 2; public MAIndexResearch() { indexPatterns = new ArrayList<int[]>(); // 1*2*3*4*5*6*7*8*9 = 3628800 validPatterns = new int[indexLen]; invalidPatterns = new int[indexLen]; index = 1; // index = 0, pattern is 0 0 0 0 0 0 0 0 ... if (indexLen > 1) { validPatterns[0] +=1; indexPatterns.add(new int[indexLen]); } for (int i = 1; i < indexLen; i++) { for (int j = 1; j <= i; j++) { int[] p = new int[indexLen]; p[i] = j; if (isInBound(p)) { index++; indexPatterns.add(p); int maxI = getMaxIndex(p); if (isValidate(p)) { validPatterns[maxI] += 1; } else { invalidPatterns[maxI] += 1; } iniIndexPatterns(i, p); } } } // int maxI = 0; // for (int[] ps : indexPatterns) { // maxI = getMaxIndex(ps); // if (isValidate(ps)) { // validPatterns[maxI] += 1; // } else { // invalidPatterns[maxI] += 1; // } // } printPatterns("valid max index frequncy", validPatterns); System.out.println("\n-----------------------\n"); printPatterns("invalid max index frequncy", invalidPatterns); System.out.println("\n-----------------------\n"); System.out.println("total pattern = " + index + "; indexPatterns.size() = " + indexPatterns.size()); System.out.println("\n-----------------------\n"); System.out.println("testI = " + testI + " : \n"); for (int[] p : indexPatterns) { int maxI = getMaxIndex(p); if (maxI == testI) { printPatterns(p); } } } private void iniIndexPatterns(int currentI, int[] currentP) { if (currentI <= 1) { return; } else { for (int j = 0; j < currentI; j++) { int[] newP = new int[currentP.length]; System.arraycopy(currentP, 0, newP, 0, currentP.length); newP[currentI - 1] = j; if (isInBound(newP)) { if (!contains(newP)) { index++; indexPatterns.add(newP); int maxI = getMaxIndex(newP); if (isValidate(newP)) { // System.out.println("index = " + index); // printPatterns(newP); validPatterns[maxI] += 1; // } else { // invalidPatterns[maxI] += 1; } else { invalidPatterns[maxI] += 1; } } iniIndexPatterns(currentI - 1, newP); } } } } private boolean contains(int[] newP) { for (int[] p : indexPatterns) { if (isRepeated(p, newP)) return true; } return false; } public boolean isRepeated(int[] currentP, int[] newP) { for (int i = 0; i < currentP.length; i++) { if (currentP[i] != newP[i]) return false; } return true; // int noZeroI = 0; // for (int i = 1; i < pattern.length; i++) { // if (pattern[i] > 0) { // noZeroI = i; // break; // } // } // // if (noZeroI > 0 && noZeroI - preI > 1) { // return true; // } else { // return false; // } } private boolean isInBound(int[] pattern) { for (int i = 0; i < pattern.length; i++) { if (pattern[i] > i) return false; } return true; } private boolean isValidate(int[] pattern) { // Rule: index k cannot be appeared unless k-1 appeared before it appears int[] indexFreq = new int[pattern.length]; for (int i = 0; i < pattern.length; i++) { indexFreq[pattern[i]] += 1; if (i > 0 && (pattern[i] - pattern[i - 1] > 1)) { for (int f = 0; f < i; f++) { if (indexFreq[f] < 1) return false; } } } return true; } public int getMaxIndex(int[] pattern) { int max = 0; for (int p : pattern) { if (p > max) { max = p; } } return max; } public void printPatterns(String message, int[] patterns) { System.out.println(message); for (int i = 0; i < patterns.length; i++) { System.out.println(i + " : " + patterns[i]); } } public void printPatterns(int[] patterns) { for (int pattern : patterns) { System.out.print(pattern + "\t"); } System.out.println("\n"); } public static void main(String[] args) { MAIndexResearch ma = new MAIndexResearch(); } }