public code v1

This commit is contained in:
2026-05-22 11:14:29 +02:00
parent 427197ec5a
commit b8141736eb
28859 changed files with 575079 additions and 0 deletions
+223
View File
@@ -0,0 +1,223 @@
package afryca.cm;
import afryca.valueforcer.ValueForcer;
/**
* Consensus matrix
*
* @author Sinbad²
* @version 3.0
*/
public class CM implements Cloneable {
public final static float MAXIMUM_VALUE = 1.0f;
public final static float MINIMUM_VALUE = 0.0f;
public final static char ROWS_SEPARATOR = ':';
public final static char COLS_SEPARATOR = ',';
private Object[][] preferences;
private int numberOfAlternatives = -1;
private int numberOfCriteria = -1;
/**
* Build a Structure for numberOfAlternatives
*
* @param numberOfAlternatives
* Number of alternatives
*
* @throws IllegalArgumentException
* if numberOfAlternatives is negative
*/
public CM(int numberOfAlternatives) {
prepareStructureForNAlternatives(numberOfAlternatives);
initialize();
}
public CM(int numberOfCriteria, int numberOfAlternatives) {
prepareStructureForNCriteriaMAlternatives(numberOfCriteria, numberOfAlternatives);
initialize();
}
private void prepareStructureForNAlternatives(int n) {
ValueForcer.notNegative(n);
numberOfAlternatives = n;
preparePreferencesStructure();
}
private void preparePreferencesStructure() {
if(numberOfCriteria == -1) {
numberOfCriteria = numberOfAlternatives;
}
preferences = new Object[numberOfCriteria][numberOfAlternatives];
}
/**
* Initialize CM with maximum value
*/
public void initialize() {
for (int row = 0; row < numberOfCriteria; row++) {
for (int col = 0; col < numberOfAlternatives; col++) {
preferences[row][col] = MAXIMUM_VALUE;
}
}
}
private void prepareStructureForNCriteriaMAlternatives(int n, int m) {
ValueForcer.notNegative(n);
ValueForcer.notNegative(m);
numberOfCriteria = n;
numberOfAlternatives = m;
preparePreferencesStructure();
}
/**
* Set preference of alternative_i over alternative_j (a_i/a_j) as value
*
* @param i
* alternative_i
* @param j
* alternative_j
* @param value
* Preference value
*
* @throws NullPointerException
* if value is null
* @throws IllegalArgumentException
* if value is not between 0 and 1
* @throws IllegalArgumentException
* if i isn't an alternative index
* @throws IllegalArgumentException
* if j isn't an alternative index
*/
public void setValue(int i, int j, Object value) {
notInvalidPairOfAlternatives(i, j);
if(value instanceof Float) {
// ValueForcer.notOutOfRange((Float) value, MINIMUM_VALUE, MAXIMUM_VALUE);
preferences[i][j] = truncateToTwoDecimals((Float) value);
} else {
preferences[i][j] = value;
}
}
private void notInvalidPairOfAlternatives(int i, int j) {
ValueForcer.notOutOfRange(i, 0, numberOfCriteria - 1);
ValueForcer.notOutOfRange(j, 0, numberOfAlternatives - 1);
}
private static Float truncateToTwoDecimals(Float value) {
return Math.round(value * 100.0f) / 100.0f;
}
/**
* Get preference of alternative_i over alternative_j (a_i/a_j)
*
* @param i
* alternative_i
* @param j
* alternative_j
*
* @throws IllegalArgumentException
* if i isn't an alternative index
* @throws IllegalArgumentException
* if j isn't an alternative index
*
* @return Preference of alternative_i over alternative_j (a_i/a_j)
*/
public Object getValue(int i, int j) {
notInvalidPairOfAlternatives(i, j);
return preferences[i][j];
}
/**
* Return square matrix with all preference relations
*
* @return Square matrix with all preference relations
*/
public Object[][] getCM() {
return preferences;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
for (int i = 0; i < preferences.length; i++) {
result.append(rowToString(i));
if (i < (preferences.length - 1)) {
result.append(ROWS_SEPARATOR);
}
}
return result.toString();
}
private StringBuilder rowToString(int row) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < preferences[row].length; i++) {
result.append(preferences[row][i]);
if (i < (preferences[row].length - 1)) {
result.append(COLS_SEPARATOR);
}
}
return result;
}
/**
* Return FPR in pretty string format
*
* @return String that represents FPR in pretty string format
*/
public String prettyFormat() {
StringBuilder result = new StringBuilder();
for (int i = 0; i < preferences.length; i++) {
result.append(rowToPrettyString(i));
if (i < (preferences.length - 1)) {
result.append("\n"); //$NON-NLS-1$
}
}
return result.toString();
}
private StringBuilder rowToPrettyString(int row) {
StringBuilder result = new StringBuilder(" | "); //$NON-NLS-1$
for (int i = 0; i < preferences[row].length; i++) {
result.append(preferences[row][i]);
result.append("\t|"); //$NON-NLS-1$
if (i < (preferences[row].length - 1)) {
result.append(" "); //$NON-NLS-1$
}
}
return result;
}
@Override
public CM clone() throws CloneNotSupportedException {
CM result = (CM) super.clone();
result.preferences = clonePreferences();
result.numberOfAlternatives = numberOfAlternatives;
result.numberOfCriteria = numberOfCriteria;
return result;
}
private Object[][] clonePreferences() {
Object[][] result = new Float[preferences.length][];
for (int i = 0; i < preferences.length; i++) {
result[i] = clonePreferencesRow(i);
}
return result;
}
private Object[] clonePreferencesRow(int row) {
Object[] result = new Object[preferences[row].length];
for (int i = 0; i < preferences[row].length; i++) {
if(preferences[row][i] instanceof Float) {
result[i] = (preferences[row][i] == null) ? null : Float.valueOf((Float) preferences[row][i]);
} else {
result[i] = (preferences[row][i] == null) ? null : new String((String) preferences[row][i]);
}
}
return result;
}
}