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
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>
@@ -0,0 +1 @@
/bin/
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>afryca.consensusmodel.ishizaka2018</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
@@ -0,0 +1,7 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.source=1.8
@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
@@ -0,0 +1,15 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: afryca.consensusmodel.ishizaka2018;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: afryca.consensusmodel,
afryca.mpr.gui,
javax.inject,
org.eclipse.jface,
org.eclipse.wb.swt
Import-Package: org.apache.commons.math3.linear,
org.eclipse.e4.core.services.nls,
org.eclipse.e4.ui.services
Automatic-Module-Name: afryca.consensusmodel.ishizaka2018
@@ -0,0 +1,16 @@
#Properties file for afryca.consensusmodel.ishizaka2018
Bundle-Name = Ishizaka2018
afryca.consensusmodel.ishizaka2018.name = A. Ishizaka et al. (2018)
afryca.consensusmodel.ishizaka2018.information = Paper: A. Ishizaka, L. Martínez. Consensual Group-AHPSort: Applying consensus to GAHPSort\\n\\nThe proposal considers the use of a consensus process in the Group-AHPSort proposal to achieve a minimum degree of consensus before the aggregation processess. In this way, it is possible to avoid the misclassifications produce by desagreement among experts.
afryca.consensusmodel.ishizaka2018.features = Consensus process\\nMinimum cost consensus\\nMulti-criteria\\nLinear programming
afryca.consensusmodel.ishizaka2018.observations = The proposal uses multiplicative preference relation with Saaty scale.
afryca.consensus.model.ishizaka2018.variable.central.description = Use central profiles
afryca.consensus.model.ishizaka2018.variable.classes.description = The ordered classification classes
afryca.consensus.model.ishizaka2018.variable.cost.description = Experts' cost
afryca.consensus.model.ishizaka2018.variable.classes.default = Accept;Refuse
afryca.consensus.model.ishizaka2018.variable.criteria.description = Insert pairwise criteria comparison
afryca.consensus.model.ishizaka2018.variable.epsilon.description = Minimum distance to the collective allowed
afryca.consensus.model.ishizaka2018.variable.profiles.description = Insert profiles of the classes
afryca.consensus.model.ishizaka2018.variable.vision.description = Pessimistic vision (not selected means optimistic vision)
afryca.consensus.model.ishizaka2018.variable.pairwise.description = Insert pairwise comparison between profiles and alternatives
afryca.consensus.model.ishizaka2018.variable.weights.description = Experts' weights
@@ -0,0 +1,16 @@
#Properties file for afryca.consensusmodel.ishizaka2018
Bundle-Name = Ishizaka2018
afryca.consensusmodel.ishizaka2018.name = A. Ishizaka et al. (2018)
afryca.consensusmodel.ishizaka2018.information = Paper: A. Labella, A. Ishizaka, L. Martínez. Consensual Group-AHPSort: Applying consensus to GAHPSort\\n\\nLa propuesta considera el uso de procesos de consenso en la propuesta Group-AHPSort para alcanzar un mínimo grado de consenso antes del proceso de agregación. Evitando de esta manera malas clasificaciones producidas por el desacuerdo entre expertos.
afryca.consensusmodel.ishizaka2018.features = Inclusión de procesos de consenso\\nMínimo coste\\nMulti-criterio\\nProgramación lineal
afryca.consensusmodel.ishizaka2018.observations = La propuesta usa relaciones de preferencia multiplicativas con escala de Saaty.
afryca.consensus.model.ishizaka2018.variable.central.description = Usar perfiles centrales
afryca.consensus.model.ishizaka2018.variable.classes.description = Clases para la clasificación
afryca.consensus.model.ishizaka2018.variable.cost.description = Coste de expertos
afryca.consensus.model.ishizaka2018.variable.classes.default = Acceptar;Rechazar
afryca.consensus.model.ishizaka2018.variable.criteria.description = Insertar matrices de comparación entre criterios
afryca.consensus.model.ishizaka2018.variable.epsilon.description = Mínima distancia a la colectiva permitida
afryca.consensus.model.ishizaka2018.variable.profiles.description = Insertar perfiles
afryca.consensus.model.ishizaka2018.variable.vision.description = Visión pesimista (no seleccionarlo significa visión optimista)
afryca.consensus.model.ishizaka2018.variable.pairwise.description = Insertar perfiles de las clases
afryca.consensus.model.ishizaka2018.variable.weights.description = Peso de expertos
@@ -0,0 +1,8 @@
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
OSGI-INF/l10n/bundle.properties,\
OSGI-INF/,\
icons/
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
<extension
point="afryca.consensusmodel">
<ConsensusModel
ConsensusModel="afryca.consensusmodel.ishizaka2018.Ishizaka2018"
Information="%afryca.consensusmodel.ishizaka2018.information"
MainFeatures="%afryca.consensusmodel.ishizaka2018.features"
Multicriteria="true"
Name="%afryca.consensusmodel.ishizaka2018.name"
Observations="%afryca.consensusmodel.ishizaka2018.observations"
Structure="afryca.mpr"
WithFeedback="false"
id="Ishizaka-2018">
<Variable
default_value="%afryca.consensus.model.ishizaka2018.variable.classes.default"
description="%afryca.consensus.model.ishizaka2018.variable.classes.description"
id="classes"
is_array="true"
is_internal="false"
type="String">
<Array_restriction
type="number_of_elements_greater_than"
value="1">
</Array_restriction>
</Variable>
<Variable
default_value="false"
description="%afryca.consensus.model.ishizaka2018.variable.central.description"
id="central profiles"
is_array="false"
is_internal="false"
type="Boolean">
</Variable>
<Variable
description="%afryca.consensus.model.ishizaka2018.variable.profiles.description"
id="profiles"
is_array="false"
is_internal="false"
type="Dialog">
<Dialog
dialog="afryca.consensusmodel.ishizaka2018.dialog.ProfilesDialog">
</Dialog>
</Variable>
<Variable
description="%afryca.consensus.model.ishizaka2018.variable.pairwise.description"
id="pairwise profiles"
is_array="false"
is_internal="false"
type="Dialog">
<Dialog
dialog="afryca.consensusmodel.ishizaka2018.dialog.PairwiseLimitingProfilesAlternativesDialog">
</Dialog>
</Variable>
<Variable
description="%afryca.consensus.model.ishizaka2018.variable.criteria.description"
id="criteria importance"
is_array="false"
is_internal="false"
type="Dialog">
<Dialog
dialog="afryca.consensusmodel.ishizaka2018.dialog.PairwiseCriteriaDialog">
</Dialog>
</Variable>
<Variable
default_value="0.8"
description="%afryca.consensus.model.ishizaka2018.variable.epsilon.description"
id="epsilon"
is_array="false"
is_internal="false"
type="Float">
<Restriction
type="lower_limit"
value="0">
</Restriction>
<Restriction
type="upper_limit"
value="1">
</Restriction>
</Variable>
<Variable
array_default_element_value="1"
description="%afryca.consensus.model.ishizaka2018.variable.cost.description"
id="cost"
is_array="true"
is_internal="false"
type="Integer">
<Array_relation
type="number_of_elements_equals_to"
variable="experts">
</Array_relation>
<Array_restriction
type="element_lower_limit"
value="0">
</Array_restriction>
</Variable>
<Variable
array_default_element_value="1"
description="%afryca.consensus.model.ishizaka2018.variable.weights.description"
id="weights"
is_array="true"
is_internal="false"
type="Float">
<Array_relation
type="number_of_elements_equals_to"
variable="experts">
</Array_relation>
<Array_restriction
type="element_lower_limit"
value="0">
</Array_restriction>
<Array_restriction
type="element_upper_limit"
value="1">
</Array_restriction>
<Array_restriction
type="elements_sum_value"
value="1">
</Array_restriction>
</Variable>
<Variable
description="%afryca.consensus.model.ishizaka2018.variable.vision.description"
id="pessimistic vision"
is_array="false"
is_internal="false"
type="Boolean">
</Variable>
</ConsensusModel>
</extension>
</plugin>
@@ -0,0 +1,21 @@
package afryca.consensusmodel.ishizaka2018;
public interface IParametersIDs {
String CLASSES = "classes"; //$NON-NLS-1$
String PROFILES = "profiles";
String PAIRWISE_ALTERNATIVES_PROFILE = "pairwise_alternatives_profiles";
String PAIRWISE_CRITERIA = "pairwise_criteria";
String CENTRAL_PROFILES = "central profiles";
String EPSILON = "epsilon"; //$NON-NLS-1$ //
String COST = "cost"; //$NON-NLS-1$ //
String WEIGHTS = "weights"; //$NON-NLS-1$ //
String AGREED_PROFILE_EXPERTS = "agreed profile for all decision makers";
String AGREED_WEIGHTS_EXPERTS = "agreed weights for all decision makers";
String AGREED_PAIRWISE_EXPERTS = "agreed pairwise comparison alternatives-profiles for all decision makers";
String PESSIMISTIC_VISION = "pessimistic vision";
}
@@ -0,0 +1,804 @@
package afryca.consensusmodel.ishizaka2018;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.commons.math3.linear.EigenDecomposition;
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.RealVector;
import afryca.consensumodel.addon.E4DIAddon;
import afryca.consensusmodel.ConsensusModelMulticriteria;
import afryca.consensusmodel.definition.EResultElements;
import afryca.consensusmodel.ishizaka2018.dialog.PairwiseCriteriaDialog;
import afryca.consensusmodel.ishizaka2018.dialog.PairwiseLimitingProfilesAlternativesDialog;
import afryca.consensusmodel.ishizaka2018.dialog.ProfilesDialog;
import afryca.mpr.MPR;
import afryca.structure.Structure;
import afryca.structure.pair.Pair;
import afryca.structure.pair.Quadruple;
import afryca.structure.pair.Triplet;
public class Ishizaka2018 extends ConsensusModelMulticriteria {
private static final String CONSENSUS_MODEL_NAME = "A. Ishizaka et al. (2018)"; //$NON-NLS-1$
private Boolean centralProfiles;
private Boolean pesimisticVision;
private Integer numberOfProfiles;
private String[] classes;
private Float epsilon;
private Integer[] cost;
private Float[] expertsWeights;
// <Expert, Criterion, Class>, Limit
private Map<Triplet<Integer, Integer, Integer>, Float> profiles;
// <Expert, Criterion, Class>, Limit
private Map<Triplet<Integer, Integer, Integer>, Float> consensualProfiles;
// <Expert, Criterion, Alternative, Profile>, MPR>
private Map<Quadruple<Integer, Integer, Integer, Integer>, MPR> consensualPairwiseAlternativesProfiles;
// <Expert, MPR>
private Map<Integer, MPR> pairwiseCriteriaByExpert;
// <Expert, Criterion, Alternative, Profile> MPR>
private Map<Quadruple<Integer, Integer, Integer, Integer>, MPR> pairwiseAlternativesProfiles;
// <Expert, Weights>
private Map<Integer, Float[]> criteriaWeightsByExpert;
// <<Expert, Criterion, Alternative>, LocalPriority>
private Map<Quadruple<Integer, Integer, Integer, Integer>, Double> localPriorityAlternatives;
// <<Expert, Criterion, Alternative, Profile>, LocalPriority>
private Map<Quadruple<Integer, Integer, Integer, Integer>, Double> localPriorityProfiles;
// <<Expert, Alternative, Profile>, GlobalPriority>
private Map<Triplet<Integer, Integer, Integer>, Double> globalPrioritiesAlternativesByExpert;
// <<Expert, Alternative, Profile>, GlobalPriority>
private Map<Triplet<Integer,Integer, Integer>, Double> globalPrioritiesProfilesByExpert;
// <Expert, Alternative, Profile>, Pair<GlobalAlternative, GlobalProfile>
private Map<Pair<Integer, Integer>, Integer> classificationAlternativesByExpert;
// <Alternative, Class>
private Map<Integer, Integer> classificationByAlternatives;
// <Profile1, Profile2>
private List<Integer> classesHalfCase;
private Structure[] visualizationPreferences;
@Override
protected void setModelConfiguration() {
this.configuration.setValue(IParametersIDs.PAIRWISE_CRITERIA, PairwiseCriteriaDialog.getPairwiseCriteria());
this.configuration.setValue(IParametersIDs.PAIRWISE_ALTERNATIVES_PROFILE, PairwiseLimitingProfilesAlternativesDialog.getPairwiseAlterativesProfiles());
this.configuration.setValue(IParametersIDs.PROFILES, ProfilesDialog.getProfiles());
}
@Override
protected void obtainConfigurationValues() {
getParametersValue();
initializeVariables();
}
private void getParametersValue() {;
getBooleanParameters();
getVectorsParameters();
getMapParameters();
getValueParameters();
}
private void getBooleanParameters() {
centralProfiles = getBooleanValue(IParametersIDs.CENTRAL_PROFILES);
pesimisticVision = (Boolean) configuration.getValue(IParametersIDs.PESSIMISTIC_VISION);
}
private Boolean getBooleanValue(String id) {
return (Boolean) configuration.getValue(id);
}
private void getVectorsParameters() {
classes = (String[]) configuration.getValue(IParametersIDs.CLASSES);
cost = (Integer[]) configuration.getValue(IParametersIDs.COST);
expertsWeights = (Float[]) configuration.getValue(IParametersIDs.WEIGHTS);
}
@SuppressWarnings("unchecked")
private void getMapParameters() {
profiles = (Map<Triplet<Integer, Integer, Integer>, Float>)
configuration.getValue(IParametersIDs.PROFILES);
pairwiseCriteriaByExpert = (Map<Integer, MPR>)
configuration.getValue(IParametersIDs.PAIRWISE_CRITERIA);
pairwiseAlternativesProfiles = (Map<Quadruple<Integer, Integer, Integer, Integer>, MPR>)
configuration.getValue(IParametersIDs.PAIRWISE_ALTERNATIVES_PROFILE);
}
private void getValueParameters() {
epsilon = (Float) configuration.getValue(IParametersIDs.EPSILON);
}
private void initializeVariables() {
numberOfProfiles = (centralProfiles) ? classes.length : classes.length - 1;
visualizationPreferences = new Structure[experts.length + 1];
consensualProfiles = new LinkedHashMap<>();
consensualPairwiseAlternativesProfiles = new LinkedHashMap<>();
for(Quadruple<Integer, Integer, Integer, Integer> key: pairwiseAlternativesProfiles.keySet()) {
try {
consensualPairwiseAlternativesProfiles.put(key, (MPR) pairwiseAlternativesProfiles.get(key).clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
initializePairwiseComparisons();
}
private void initializePairwiseComparisons() {
if (pairwiseAlternativesProfiles.size() != experts.length * criteria.length * alternatives.length * numberOfProfiles) {
initializePairwiseAlternativesProfiles();
}
if (pairwiseCriteriaByExpert.isEmpty()) {
pairwiseCriteriaByExpert = initializeModifiedPairwiseCriteria();
}
}
private void initializePairwiseAlternativesProfiles() {
pairwiseAlternativesProfiles.clear();
for (int s = 0; s < experts.length; ++s) {
for (int j = 0; j < criteria.length; ++j) {
for (int k = 0; k < alternatives.length; ++k) {
for (int i = 0; i < numberOfProfiles; ++i) {
Quadruple<Integer, Integer, Integer, Integer> q = new Quadruple<Integer, Integer, Integer, Integer>(s, j, k, i);
pairwiseAlternativesProfiles.put(q, new MPR(2));
}
}
}
}
}
private Map<Integer, MPR> initializeModifiedPairwiseCriteria() {
Map<Integer, MPR> result = new HashMap<>();
for (int exp = 0; exp < experts.length; ++exp) {
result.put(exp, new MPR(criteria.length));
}
return result;
}
@Override
protected void preFirstSaveRoundResults() {
computeWeightingVectors(pairwiseCriteriaByExpert);
computeLocalPriorities();
computeGlobalPriorities();
groupAggregation();
preSaveRoundResult(1, visualizationPreferences, obtainVisualizeValues(), 0f);
result.put(EResultElements.initial_consensus_degree, 0);
result.put(EResultElements.maxround, 1);
result.put(EResultElements.consensus_threshold, epsilon);
result.put(EResultElements.consensus_model, CONSENSUS_MODEL_NAME);
}
@Override
protected void preSaveRoundResults() {
preSaveRoundResult(1, visualizationPreferences, obtainVisualizeValues(), 0f);
}
@Override
protected void consensusRound() {
computeConsensus();
computeLocalPriorities();
computeGlobalPriorities();
groupAggregation();
}
private void computeConsensus() {
computeConsensusCriteriaWeights();
computeConsensusProfiles();
computeChangeDegreesConsensualProfiles();
computeConsensusPairwiseComparisons();
}
/**
* Compute the consensus among the weights of the experts
*/
private void computeConsensusCriteriaWeights() {
Float[] values, nValues;
MPR consensusPairwise = new MPR(numberOfCriteria);
for (int j = 0; j < criteria.length - 1; ++j) {
for (int l = j + 1; l < criteria.length; ++l) {
values = new Float[experts.length];
for (int s = 0; s < experts.length; ++s) {
values[s] = (Float) pairwiseCriteriaByExpert.get(s).getValue(j, l);
}
if(!computePreConsensus(values)) {
nValues = normalizeValues(values);
ArrayList<String> consensusWeightsMC = computeMinimumCostConsensus(nValues);
consensusWeightsMC = getOriginalValues(values, consensusWeightsMC);
values = setCollectiveConsensualValues(consensusWeightsMC);
}
consensusPairwise.setValueSymmetrically(j, l, values[0]);
}
}
setConsensualWeightsToExperts(consensusPairwise);
}
private void setConsensualWeightsToExperts(MPR consensusPairwise) {
for(int s = 0; s < experts.length; ++s) {
criteriaWeightsByExpert.put(s, Ishizaka2018Utils.normalizeVector(computeWeightsVector(consensusPairwise)));
}
}
/**
* Compute the consensus among the profiles of the experts
*/
private void computeConsensusProfiles() {
Map<Pair<Integer, Integer>, Float[]> consensualProfiles = new LinkedHashMap<>();
Float[] values, nValues;
for (int j = 0; j < criteria.length; ++j) {
for (int i = 0; i < numberOfProfiles; ++i) {
values = new Float[experts.length];
for (int s = 0; s < experts.length; ++s) {
values[s] = profiles.get(new Triplet<Integer, Integer, Integer>(s, j, i));
}
if(!computePreConsensus(values)) {
nValues = normalizeValues(values);
ArrayList<String> consensualProfilesMinimumCost = computeMinimumCostConsensus(nValues);
consensualProfilesMinimumCost = getOriginalValues(values, consensualProfilesMinimumCost);
consensualProfiles.put(new Pair<Integer, Integer>(j, i), setCollectiveConsensualValues(consensualProfilesMinimumCost));
} else {
consensualProfiles.put(new Pair<Integer, Integer>(j, i), values);
}
}
}
setProfiles(consensualProfiles);
}
/**
*
* @param values: values to reach consensus
* @return true if all the values are equal, false otherwise
*/
private boolean computePreConsensus(Object[] values) {
return Arrays.asList(values).isEmpty() || Arrays.asList(values).stream().allMatch(values[0]::equals);
}
private Float[] normalizeValues(Float[] values) {
Float min = (Float) Collections.min(Arrays.asList(values));
Float max = (Float) Collections.max(Arrays.asList(values));
Float[] normalizedValues = new Float[values.length];
for(int i = 0; i < values.length; ++i) {
normalizedValues[i] = (values[i] - min) / (max - min);
}
return normalizedValues;
}
@SuppressWarnings("unchecked")
private ArrayList<String> computeMinimumCostConsensus(Float[] values) {
return (ArrayList<String>)
(E4DIAddon.aseService.createFragmentBuilder()
.putVariable(IParametersIDs.EPSILON, epsilon)
.putVariable(IParametersIDs.COST, cost)
.putVariable(IParametersIDs.WEIGHTS, expertsWeights)
.putVariable("prefs", values)
.setCode("consensus.zhang2011minimumcostVectorWeights(epsilon, cost, prefs, weights)")
.setOutputType("java.util.ArrayList")
.eval())
.getResult();
}
private ArrayList<String> getOriginalValues(Float[] values, ArrayList<String> consensualProfilesMinimumCost) {
Float min = (Float) Collections.min(Arrays.asList(values));
Float max = (Float) Collections.max(Arrays.asList(values));
ArrayList<String> originalValues = new ArrayList<String>();
for(String value: consensualProfilesMinimumCost) {
originalValues.add(Float.toString((max - min) * Float.parseFloat(value) + min));
}
return originalValues;
}
private Float[] setCollectiveConsensualValues(ArrayList<String> consensusProfilesMC) {
Float[] result = new Float[consensusProfilesMC.size()];
Float acum = 0f;
for (int s = 0; s < experts.length; ++s) {
acum += Float.parseFloat(consensusProfilesMC.get(s)) * expertsWeights[s];
}
for (int s = 0; s < experts.length; ++s) {
result[s] = acum;
}
return result;
}
private void setProfiles(Map<Pair<Integer, Integer>, Float[]> consensusProfiles) {
for (Pair<Integer, Integer> pair : consensusProfiles.keySet()) {
for (int s = 0; s < consensusProfiles.get(pair).length; ++s) {
consensualProfiles.put(new Triplet<Integer, Integer, Integer>
(s, pair.getLeft(), pair.getRight()), consensusProfiles.get(pair)[s]);
}
}
}
private void computeChangeDegreesConsensualProfiles(){
Map<Triplet<Integer, Integer, Integer>, Float> changeDegrees = new HashMap<>();
Float consensualProfile, expertProfile, changeDegree;
for (int s = 0; s < experts.length; ++s) {
for (int j = 0; j < criteria.length; ++j) {
for (int i = 0; i < numberOfProfiles; ++i) {
consensualProfile = consensualProfiles.get(new Triplet<Integer, Integer, Integer>(s, j, i));
expertProfile = profiles.get(new Triplet<Integer, Integer, Integer>(s, j, i));
changeDegree = 100f - ((consensualProfile / expertProfile) * 100f);
changeDegrees.put(new Triplet<Integer, Integer, Integer>(s, j, i), changeDegree);
}
}
}
computeNewComparisionProfilesAlternatives(changeDegrees);
}
private void computeNewComparisionProfilesAlternatives(Map<Triplet<Integer, Integer, Integer>, Float> changeDegrees) {
Float changeDegree, currentValuation;
MPR pairwiseExpert;
for (int s = 0; s < experts.length; ++s) {
for (int j = 0; j < criteria.length; ++j) {
for (int i = 0; i < numberOfProfiles; ++i) {
changeDegree = changeDegrees.get(new Triplet<Integer, Integer, Integer>(s, j, i));
for (int k = 0; k < alternatives.length; ++k) {
try {
pairwiseExpert = (MPR) pairwiseAlternativesProfiles.get(new Quadruple<Integer, Integer, Integer, Integer>(s, j, k, i)).clone();
currentValuation = (Float) pairwiseExpert.getValue(0, 1);
if(Math.abs(changeDegree) > 11.0f) {
currentValuation += currentValuation * (changeDegree / 100f);
/*if(j == 2) { //Para el caso concreto de la esperanza de vida, borrar todo cuando terminemos el paper
currentValuation += currentValuation * (-changeDegree / 100f);
} else {
currentValuation += currentValuation * (changeDegree / 100f);
}*/
if(currentValuation > 9.0f) {
currentValuation = 9.0f;
} else if(currentValuation < 1/9f) {
currentValuation = 1/9f;
}
pairwiseExpert.setValueSymmetrically(0, 1, currentValuation);
consensualPairwiseAlternativesProfiles.put(new Quadruple<Integer, Integer, Integer, Integer>(s, j, k, i), pairwiseExpert);
}
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
}
}
}
/**
* Compute the consensus pairwise comparison alternative-profiles of the experts
*/
private void computeConsensusPairwiseComparisons() {
Float[] values, nValues;
for (int j = 0; j < criteria.length; ++j) {
for (int k = 0; k < alternatives.length; ++k) {
for (int i = 0; i < numberOfProfiles; ++i) {
values = new Float[experts.length];
for (int s = 0; s < experts.length; ++s) {
values[s] = (Float) consensualPairwiseAlternativesProfiles.get(new Quadruple<Integer, Integer, Integer, Integer>(s, j, k, i)).getValue(0, 1);
}
if(!computePreConsensus(values)) {
nValues = normalizeValues(values);
ArrayList<String> consensusPairwiseMC = computeMinimumCostConsensus(nValues);
consensusPairwiseMC = getOriginalValues(values, consensusPairwiseMC);
values = setIndividualConsensualValues(consensusPairwiseMC);
}
for (int sM = 0; sM < experts.length; ++sM) {
consensualPairwiseAlternativesProfiles.get(new Quadruple<Integer, Integer, Integer, Integer>(sM, j, k, i))
.setValueSymmetrically(0, 1, Math.round(values[sM] * 100d) / 100d);
}
}
}
}
}
private Float[] setIndividualConsensualValues(ArrayList<String> consensusProfilesMC) {
Float[] result = new Float[consensusProfilesMC.size()];
for (int s = 0; s < consensusProfilesMC.size(); ++s) {
result[s] = Float.parseFloat(consensusProfilesMC.get(s));
}
return result;
}
private void computeWeightingVectors(Map<Integer, MPR> criteriaPairwise) {
criteriaWeightsByExpert = new HashMap<>();
RealVector weightingVector;
for (int s = 0; s < experts.length; ++s) {
weightingVector = computeWeightsVector(criteriaPairwise.get(s));
criteriaWeightsByExpert.put(s, Ishizaka2018Utils.normalizeVector(weightingVector));
}
}
private RealVector computeWeightsVector(MPR mpr) {
RealMatrix matrix;
EigenDecomposition descomposition;
matrix = MatrixUtils.createRealMatrix(Ishizaka2018Utils.transformMPR(mpr));
descomposition = new EigenDecomposition(matrix);
return descomposition.getEigenvector(0);
}
private void computeLocalPriorities() {
localPriorityAlternatives = new LinkedHashMap<>();
localPriorityProfiles = new LinkedHashMap<>();
RealMatrix matrix;
RealVector priority;
EigenDecomposition descomposition;
Float[] normalizedPriority;
for (Quadruple<Integer, Integer, Integer, Integer> key : consensualPairwiseAlternativesProfiles.keySet()) {
matrix = MatrixUtils.createRealMatrix(Ishizaka2018Utils.transformMPR(consensualPairwiseAlternativesProfiles.get(key)));
descomposition = new EigenDecomposition(matrix);
priority = descomposition.getEigenvector(0);
normalizedPriority = Ishizaka2018Utils.normalizeVector(priority);
localPriorityAlternatives.put(new Quadruple<Integer, Integer, Integer, Integer>
(key.getQ1(), key.getQ2(), key.getQ3(), key.getQ4()), Math.round(normalizedPriority[0] * 1000d) / 1000d);
localPriorityProfiles.put(new Quadruple<Integer, Integer, Integer, Integer>
(key.getQ1(), key.getQ2(), key.getQ3(), key.getQ4()), Math.round(normalizedPriority[1] * 1000d) / 1000d);
}
}
private void computeGlobalPriorities() {
computeGlobalPrioritiesAlternatives();
computeGlobalPrioritiesProfiles();
}
private void computeGlobalPrioritiesAlternatives() {
globalPrioritiesAlternativesByExpert = new HashMap<>();
double globalPriority;
for (int k = 0; k < alternatives.length; ++k) {
for (int s = 0; s < experts.length; ++s) {
for(int i = 0; i < numberOfProfiles; ++i) {
globalPriority = 0;
for (int j = 0; j < criteria.length; ++j) {
globalPriority += localPriorityAlternatives.get(new Quadruple<Integer, Integer, Integer, Integer>(s, j, k, i)) * criteriaWeightsByExpert.get(s)[j];
}
globalPrioritiesAlternativesByExpert.put(new Triplet<Integer, Integer, Integer>(s, k, i), Math.round(globalPriority * 1000d) / 1000d);
}
}
}
}
private void computeGlobalPrioritiesProfiles() {
globalPrioritiesProfilesByExpert = new LinkedHashMap<>();
double globalPriority;
for (int k = 0; k < alternatives.length; ++k) {
for (int s = 0; s < experts.length; ++s) {
for (int i = 0; i < numberOfProfiles; ++i) {
globalPriority = 0;
for (int j = 0; j < criteria.length; ++j) {
globalPriority += localPriorityProfiles.get(new Quadruple<Integer, Integer, Integer, Integer>(s, j, k, i)) * criteriaWeightsByExpert.get(s)[j];
}
globalPrioritiesProfilesByExpert.put(new Triplet<Integer, Integer, Integer>(s, k, i), Math.round(globalPriority * 1000d) / 1000d);
}
}
}
}
private void groupAggregation() {
assignAlternativesToClassesByExpert();
assignAlternativesToClasses();
}
private void assignAlternativesToClassesByExpert() {
classificationAlternativesByExpert = new LinkedHashMap<>();
if(centralProfiles) {
classifyAlternativesByExpertCentralProfiles();
} else {
classifyAlternativesByExpertLimitingProfiles();
}
}
private void classifyAlternativesByExpertCentralProfiles() {
Double p_ks, p_is, distance, minDistance = Double.MAX_VALUE;
int assignedClass = -1;
for(int k = 0; k < alternatives.length; ++k) {
for(int s = 0; s < experts.length; ++s) {
for(int i = 0; i < numberOfProfiles; ++i) {
p_ks = globalPrioritiesAlternativesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, i));
p_is = globalPrioritiesProfilesByExpert.get(new Triplet<>(s, k, i));
distance = Math.abs(p_ks - p_is);
if(distance < minDistance) {
assignedClass = i;
}
}
classificationAlternativesByExpert.put(new Pair<Integer, Integer>(k, s), assignedClass);
}
}
}
private void classifyAlternativesByExpertLimitingProfiles() {
Double p_ks, p_is;
int assignedClass = -1;
for(int s = 0; s < experts.length; ++s) {
for(int k = 0; k < alternatives.length; ++k) {
for(int i = 0; i < numberOfProfiles; ++i) {
assignedClass = numberOfProfiles;
p_ks = globalPrioritiesAlternativesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, i));
p_is = globalPrioritiesProfilesByExpert.get(new Triplet<>(s, k, i));
if(p_ks > p_is) {
assignedClass = i;
break;
}
}
classificationAlternativesByExpert.put(new Pair<Integer, Integer>(k, s), assignedClass);
}
}
}
private void assignAlternativesToClasses() {
classificationByAlternatives = new HashMap<>();
List<Integer> classesAssignedToAlternativeByExperts = new LinkedList<Integer>();
for (int k = 0; k < alternatives.length; ++k) {
classesAssignedToAlternativeByExperts.clear();
for (int s = 0; s < experts.length; ++s) {
classesAssignedToAlternativeByExperts.add(classificationAlternativesByExpert.get(new Pair<Integer, Integer>(k, s)));
}
Collections.sort(classesAssignedToAlternativeByExperts);
classifyAlternative(classesAssignedToAlternativeByExperts, k);
}
}
private void classifyAlternative(List<Integer> classesAssignedToAlternativesByExperts, Integer alt) {
boolean unanimity = computePreConsensus(classesAssignedToAlternativesByExperts.toArray());
if (unanimity) {
classificationByAlternatives.put(alt, classesAssignedToAlternativesByExperts.get(0));
} else {
Map<Integer, Integer> repeatedClasses = Ishizaka2018Utils.countRepeatedClasses(classesAssignedToAlternativesByExperts);
if(halfCase(repeatedClasses)) {
if(centralProfiles) {
computeHalfCaseCentralProfiles(alt);
} else {
computeHalfCaseLimitingProfiles(alt);
}
} else {
classificationByAlternatives.put(alt, repeatedClasses.entrySet().iterator().next().getKey());
}
}
}
private boolean halfCase(Map<Integer, Integer> repeatedClasses) {
classesHalfCase = new LinkedList<Integer>();
Integer maxFrequency = repeatedClasses.get((Integer) repeatedClasses.keySet().toArray()[0]);
for(Integer repeatedClass: repeatedClasses.keySet()) {
if(maxFrequency.equals(repeatedClasses.get(repeatedClass))) {
classesHalfCase.add(repeatedClass);
}
}
if(classesHalfCase.size() >= 2) {
return true;
}
return false;
}
private void computeHalfCaseCentralProfiles(Integer k) {
Double globalPriorityExpertClass1, globalPriorityExpertClass2,
globalPriorityProfile1, globalPriorityProfile2,
acumDistances1 = 0d, acumDistances2 = 0d;
boolean classAssigned = false;
while(!classAssigned) {
for(int s = 0; s < experts.length; ++s) {
globalPriorityExpertClass1 = globalPrioritiesAlternativesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, classesHalfCase.get(0)));
globalPriorityExpertClass2 = globalPrioritiesAlternativesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, classesHalfCase.get(1)));
globalPriorityProfile1 = globalPrioritiesProfilesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, classesHalfCase.get(0)));
globalPriorityProfile2 = globalPrioritiesProfilesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, classesHalfCase.get(1)));
acumDistances1 += Math.abs(globalPriorityExpertClass1 - globalPriorityProfile1);
acumDistances2 += Math.abs(globalPriorityExpertClass2 - globalPriorityProfile2);
}
acumDistances1 = Math.round(acumDistances1 * 1000d) / 1000d;
acumDistances2 = Math.round(acumDistances2 * 1000d) / 1000d;
if(acumDistances1 < acumDistances2) {
classificationByAlternatives.put(k, classesHalfCase.get(0));
classAssigned = true;
} else if(classesHalfCase.size() == 2) {
if(acumDistances1 > acumDistances2) {
classificationByAlternatives.put(k, classesHalfCase.get(1));
} else {
if(pesimisticVision) {
classificationByAlternatives.put(k, classesHalfCase.get(1));
} else {
classificationByAlternatives.put(k, classesHalfCase.get(0));
}
}
classAssigned = true;
} else {
classesHalfCase.remove(0);
}
}
}
private void computeHalfCaseLimitingProfiles(Integer alt) {
List<Integer> x = new LinkedList<>(), y = new LinkedList<>();
Integer classAssignedByExpert;
boolean classAssigned = false;
while(!classAssigned) {
for(Integer exp = 0; exp < experts.length; ++exp) {
classAssignedByExpert = classificationAlternativesByExpert.get(new Pair<Integer, Integer>(alt, exp));
if(classAssignedByExpert.equals(classesHalfCase.get(0))) {
x.add(exp);//Ci
} else if(classAssignedByExpert.equals(classesHalfCase.get(1))) {
y.add(exp);//Ci+1
}
}
Double distanceGroupX = Math.round(computeDistancesGroupExpertClass1(x, alt, classesHalfCase.get(0)) * 1000d) / 1000d;
Double distanceGroupY = Math.round(computeDistancesGroupExpertClass2(y, alt, classesHalfCase.get(1)) * 1000d) / 1000d;
if(distanceGroupX > distanceGroupY) {
classificationByAlternatives.put(alt, classesHalfCase.get(0));
classAssigned = true;
} else if(classesHalfCase.size() == 2) {
if(distanceGroupX < distanceGroupY) {
classificationByAlternatives.put(alt, classesHalfCase.get(1));
} else {
if(pesimisticVision) {
classificationByAlternatives.put(alt, classesHalfCase.get(1));
} else {
classificationByAlternatives.put(alt, classesHalfCase.get(0));
}
}
classAssigned = true;
} else {
classesHalfCase.remove(0);
}
}
}
private Double computeDistancesGroupExpertClass1(List<Integer> x, Integer k, Integer i) {
Double p_ks, lp_is;
Double acumDistances = 0d;
for(Integer s: x) {
p_ks = globalPrioritiesAlternativesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, i));
lp_is = globalPrioritiesProfilesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, i));
acumDistances += p_ks - lp_is;
}
return acumDistances;
}
private Double computeDistancesGroupExpertClass2(List<Integer> y, Integer k, Integer i) {
Double p_ks, lp_is;
Double acumDistances = 0d;
for(Integer s: y) {
p_ks = globalPrioritiesAlternativesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, i));
lp_is = globalPrioritiesProfilesByExpert.get(new Triplet<Integer, Integer, Integer>(s, k, i));
acumDistances += lp_is - p_ks;
}
return acumDistances;
}
@Override
protected void groupPreferencesByCriteria() {
for(int i = 0; i < numberOfExperts; ++i) {
MPR defaultMPR = new MPR(numberOfAlternatives);
defaultMPR.random(numberOfAlternatives);
visualizationPreferences[i] = defaultMPR;
}
visualizationPreferences[numberOfExperts] = computeCollective();
}
private Structure computeCollective() {
return visualizationPreferences[0].groupPreferences(experts.length, alternatives.length, 1, visualizationPreferences);
}
@Override
protected Float[][][] obtainVisualizeValues() {
Float[][][] preferencesGroupVisualization = new Float[visualizationPreferences.length][numberOfAlternatives][numberOfAlternatives];
for (int k = 0; k < visualizationPreferences.length; k++) {
for (int i = 0; i < numberOfAlternatives; i++) {
for (int j = 0; j < numberOfAlternatives; j++) {
preferencesGroupVisualization[k] = visualizationPreferences[k].obtainVisualizeValues();
}
}
}
return preferencesGroupVisualization;
}
@Override
protected void posSaveRoundResults() {
posSaveRoundResult(visualizationPreferences, obtainVisualizeValues(), 0f, null);
}
@Override
protected void saveExecutionResults() {
this.configuration.setValue(PREFERENCES, visualizationPreferences);
result.put(EResultElements.number_of_rounds_required, 1);
result.put(EResultElements.classification_of_alternatives, classificationAlternativesToString());
result.put(EResultElements.consensus_degree_achieved, epsilon);
}
private String classificationAlternativesToString() {
StringBuilder classification = new StringBuilder();
for(String cl: classes) {
classification.append(cl);
classification.append(":");
for(Integer alt: classificationByAlternatives.keySet()) {
if(classes[classificationByAlternatives.get(alt)].equals(cl)) {
classification.append(alternativeAbbreviation(alt));
classification.append(", ");
}
}
classification.deleteCharAt(classification.length() - 1);
classification.deleteCharAt(classification.length() - 1);
classification.append(" ");
}
return classification.toString();
}
private String alternativeAbbreviation(Integer alternativeIndex) {
return "x" + (alternativeIndex + 1); //$NON-NLS-1$
}
@Override
protected boolean mustBeCarriedOutAnotherRound() {
return false;
}
}
@@ -0,0 +1,59 @@
package afryca.consensusmodel.ishizaka2018;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.math3.linear.RealVector;
import afryca.mpr.MPR;
public class Ishizaka2018Utils {
public static double[][] transformMPR(MPR mpr) {
double[][] result = new double[mpr.getNumberOfAlternatives()][mpr.getNumberOfAlternatives()];
for (int i = 0; i < result.length; ++i) {
for (int j = 0; j < result[i].length; ++j) {
result[i][j] = ((Float) mpr.getValue(i, j)).doubleValue();
}
}
return result;
}
public static Float[] normalizeVector(RealVector weightingVector) {
Float[] result = new Float[weightingVector.getDimension()];
double acum = 0;
for (Double d : weightingVector.toArray()) {
acum += d;
}
for (int i = 0; i < weightingVector.getDimension(); ++i) {
result[i] = Math.round(weightingVector.toArray()[i] / acum * 1000f) / 1000f;
}
return result;
}
public static Map<Integer, Integer> countRepeatedClasses(List<Integer> classes) {
Map<Integer, Integer> classesRepetitions = new LinkedHashMap<Integer, Integer>();
for (int i = 0; i < classes.size(); ++i) {
classesRepetitions.put(classes.get(i), Collections.frequency(classes, classes.get(i)));
}
return sortingClasses(classesRepetitions);
}
private static Map<Integer, Integer> sortingClasses(Map<Integer, Integer> classesRepetitions) {
Map<Integer, Integer> result = classesRepetitions.entrySet().stream()
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
return result;
}
}
@@ -0,0 +1,217 @@
package afryca.consensusmodel.ishizaka2018.composite;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.e4.core.contexts.ContextInjectionFactory;
import org.eclipse.e4.core.contexts.EclipseContextFactory;
import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import afryca.consensusmodel.ishizaka2018.provider.ProfilesContentProvider;
import afryca.gdmp.GDMP;
import afryca.structure.pair.Triplet;
import de.kupzog.ktable.KTable;
import de.kupzog.ktable.SWTX;
public class ProfilesComposite extends Composite {
// KTable internal value
private final static String EXCEL_CURSOR = "/icons/tableCursor.gif"; //$NON-NLS-1$
private final static int CELL_HEIGHT = 40;
private final static int CELL_WIDTH_CRITERIA = 150;
private final static int CELL_WIDTH_PROFILES = 80;
private final static int FONT_SIZE = 8;
private Map<Triplet<Integer, Integer, Integer>, Float> experts_profiles;
private List<String> criteria;
private String[] classes;
private int numberOfProfiles;
private GDMP gdmp;
private KTable consensusTable;
private ProfilesContentProvider consensusTableProvider;
private boolean editable;
private int selectionIndexExpert;
@Inject
@Optional
private Display display;
private IEclipseContext context;
private IEclipseContext contentProviderContext;
/**
* Default builder
*
* @param parent
* Parent
* @param style
* Style
*/
public ProfilesComposite(Composite parent, int style) {
super(parent, style);
editable = true;
experts_profiles = null;
numberOfProfiles = -1;
selectionIndexExpert = -1;
GridLayoutFactory
.fillDefaults()
.spacing(0, 0)
.applyTo(this);
setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
createContents();
}
private void createContents() {
createConsensusTable();
}
private void createConsensusTable() {
consensusTable = new KTable(this, SWT.NO_BACKGROUND | SWTX.EDIT_ON_KEY| SWT.CENTER);
consensusTable.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true, 1, 1));
setConsensusTableCursor();
disableConsensusTableTraverse();
}
private void setConsensusTableCursor() {
Image excelCursor = SWTX.loadImageResource(display, EXCEL_CURSOR);
Rectangle cursorBounds = excelCursor.getBounds();
Point cursorSize = new Point(cursorBounds.width / 2, cursorBounds.height / 2);
consensusTable.setDefaultCursor(new Cursor(display, excelCursor.getImageData(), 0, 0), cursorSize);
}
private void disableConsensusTableTraverse() {
consensusTable.addTraverseListener(e -> {
if (e.detail == SWT.TRAVERSE_RETURN) {
e.doit = false;
}
});
}
private void updateLayout() {
consensusTable.requestLayout();
}
@SuppressWarnings("unchecked")
public void setElements(Object... elements) {
gdmp = (GDMP) elements[0];
setNumberOfProfiles((int) elements[1]);
setExpertProfiles((Map<Triplet<Integer, Integer, Integer>, Float>) elements[2]);
setCriteria((List<String>) elements[3]);
setClasses((String[]) elements[4]);
}
private void setNumberOfProfiles(int numberOfProfiles) {
this.numberOfProfiles = numberOfProfiles;
}
private void setExpertProfiles(Map<Triplet<Integer, Integer, Integer>, Float> expertsProfiles) {
this.experts_profiles = expertsProfiles;
updateInformation();
updateLayout();
}
private void updateInformation() {
disposeContext();
if (gdmp != null) {
consensusTable.setNumRowsVisibleInPreferredSize(gdmp.getCriteria().size() + 1);
consensusTable.setNumColsVisibleInPreferredSize(numberOfProfiles + 1);
generateContentProvider();
consensusTable.setModel(consensusTableProvider);
}
}
private void setCriteria(List<String> criteria) {
this.criteria = criteria;
contentProviderContext.set(ProfilesContentProvider.CRITERIA, getCriteria());
updateLayout();
}
private void setClasses(String[] classes) {
this.classes = classes;
contentProviderContext.set(ProfilesContentProvider.CLASSES, getClasses());
updateLayout();
}
public void setEditable(boolean editable) {
this.editable = editable;
contentProviderContext.set(ProfilesContentProvider.EDITABLE, editable);
updateLayout();
}
public void setSelectionIndexExpert(int selectionIndexExpert) {
this.selectionIndexExpert = selectionIndexExpert;
contentProviderContext.set(ProfilesContentProvider.SELECTION_INDEX_EXPERT, selectionIndexExpert);
updateLayout();
}
private void disposeContext() {
if (contentProviderContext != null) {
contentProviderContext.dispose();
}
}
private void generateContentProvider() {
context = EclipseContextFactory.create();
contentProviderContext = context.createChild();
contentProviderContext.set(ProfilesContentProvider.FONT_SIZE_KEY, FONT_SIZE);
contentProviderContext.set(ProfilesContentProvider.CELL_WIDTH_KEY_CRITERIA, CELL_WIDTH_CRITERIA);
contentProviderContext.set(ProfilesContentProvider.CELL_WIDTH_KEY_PROFILES, CELL_WIDTH_PROFILES);
contentProviderContext.set(ProfilesContentProvider.CELL_HEIGHT_KEY, CELL_HEIGHT);
contentProviderContext.set(ProfilesContentProvider.SELECTION_INDEX_EXPERT, selectionIndexExpert);
contentProviderContext.set(ProfilesContentProvider.EDITABLE, editable);
contentProviderContext.set(ProfilesContentProvider.NUM_PROFILES, numberOfProfiles);
contentProviderContext.set(ProfilesContentProvider.CLASSES, getClasses());
contentProviderContext.set(ProfilesContentProvider.CRITERIA, getCriteria());
contentProviderContext.set(ProfilesContentProvider.PROVIDER_INFORMATION, experts_profiles);
contentProviderContext.set(KTable.class, consensusTable);
consensusTableProvider = ContextInjectionFactory.make(ProfilesContentProvider.class, contentProviderContext);
}
private List<String> getCriteria() {
List<String> result = new LinkedList<>();
if(criteria != null) {
for(int i = 0; i < criteria.size(); ++i) {
result.add(criteria.get(i));
}
}
return result;
}
private Object getClasses() {
List<String> result = new LinkedList<>();
if(classes != null) {
for(int i = 0; i < classes.length; ++i) {
result.add(classes[i]);
}
}
return result;
}
public void redrawTable() {
consensusTable.redraw();
}
}
@@ -0,0 +1,442 @@
package afryca.consensusmodel.ishizaka2018.dialog;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.wb.swt.ResourceManager;
import afryca.consensusmodel.ishizaka2018.icons.Icons;
import afryca.consensusmodel.ishizaka2018.l10n.Messages;
import afryca.gdmp.GDMP;
import afryca.gdmp.service.IGDMPService;
import afryca.mpr.MPR;
import afryca.mpr.MPRParser;
import afryca.mpr.gui.composite.MPRDialogPairwiseCriteriaComposite;
public class PairwiseCriteriaDialog extends TitleAreaDialog {
private static final String PLUGIN_ID = "afryca.consensusmodel.ishizaka2018"; //$NON-NLS-1$
private static final String DIALOG_CLASS_SHELL = "DialogClassShell"; //$NON-NLS-1$
private static final String TABLE_VIEWER_CLASS_COMPOSITE = "TableViewerClassComposite"; //$NON-NLS-1$
private static final String[] FILTER_NAMES = { "txt files (*.txt)" }; //$NON-NLS-1$
private static final String[] FILTER_EXTS = { "*.txt" }; //$NON-NLS-1$
private Composite container;
private Composite containerTwoColumns;
private Composite leftColumn;
private Composite rightColumn;
private Composite expertsPanel;
private MPRDialogPairwiseCriteriaComposite mprPanel;
private TableViewer expertsViewer;
private TableColumnLayout tableLayout;
@Inject
private IGDMPService gdmpService;
@Inject
private IStylingEngine engine;
@Translation
@Inject
private Messages messages;
@Translation
@Inject
private Icons icons;
private GDMP gdmp;
//<Expert, MPR>
private static Map<Integer, MPR> pairwiseMatrices;
public PairwiseCriteriaDialog() {
super(null);
pairwiseMatrices = new HashMap<>();
}
public PairwiseCriteriaDialog(Shell parentShell) {
super(parentShell);
pairwiseMatrices = new HashMap<>();
}
@Override
protected Control createDialogArea(Composite parent) {
container = (Composite) super.createDialogArea(parent);
GridLayoutFactory.fillDefaults().margins(0, 0).applyTo(container);
styleDialog();
if(gdmpService.getSelection() != null) {
checkConditionsInitializePairwise();
createControls();
}
return container;
}
private void styleDialog() {
engine.setClassname(getShell(), DIALOG_CLASS_SHELL);
getShell().setText(messages.pairwise_comparison_criteria);
setTitleImage(ResourceManager.getPluginImage(PLUGIN_ID, icons.pairwise));
setTitle(messages.pairwise_comparison_criteria);
setMessage(messages.introduce_pairswise_criteria, SWT.NONE);
}
private void checkConditionsInitializePairwise() {
if(gdmp == null) {
initializePairwaiseMatrices();
} else {
if(!gdmp.getSimpleName().equals(gdmpService.getSelection().getSimpleName())) {
initializePairwaiseMatrices();
} else {
changesPairwaiseMatrices();
}
}
}
private void initializePairwaiseMatrices() {
gdmp = gdmpService.getSelection();
int numberOfCriteria = gdmp.getCriteria().size();
for(int expert = 0; expert < gdmp.getExperts().size(); ++expert) {
pairwiseMatrices.put(expert, new MPR(numberOfCriteria));
}
}
private void changesPairwaiseMatrices() {
gdmp = gdmpService.getSelection();
int numberOfCriteria = gdmp.getCriteria().size();
MPR mpr;
for(int expert = 0; expert < gdmp.getExperts().size(); ++expert) {
mpr = pairwiseMatrices.get(expert);
pairwiseMatrices.put(expert, (mpr == null) ? new MPR(numberOfCriteria): mpr);
}
}
private void createControls() {
containerTwoColumns = new Composite(container, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, false);
containerTwoColumns.setLayout(gridLayout);
GridData gridDataParent = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
containerTwoColumns.setLayoutData(gridDataParent);
createLeftColumn();
createRightColumn();
createButtonsComposite();
}
private void createLeftColumn() {
leftColumn = new Composite(containerTwoColumns, SWT.BORDER);
leftColumn.setLayout(new GridLayout(1, true));
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.widthHint = 40;
leftColumn.setLayoutData(gd);
createExpertsPanel();
}
private void createExpertsPanel() {
expertsPanel = new Composite(leftColumn, SWT.NONE);
expertsPanel.setLayout(new GridLayout(1, true));
expertsPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
engine.setClassname(expertsPanel, TABLE_VIEWER_CLASS_COMPOSITE);
createHeader(expertsPanel, messages.experts, icons.experts);
expertsViewer = createViewer(expertsPanel, GDMP.EXPERT_PREFIX, GDMP.FIELD_EXPERTS);
expertsViewer.setInput(gdmpService.getSelection().getExperts().toArray());
layoutTableColumns(expertsViewer);
expertsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelection();
}
});
}
private void checkSelection() {
if(expertsViewer.getTable().getSelectionIndex() != -1) {
MPR mpr = pairwiseMatrices.get(expertsViewer.getTable().getSelectionIndex());
mprPanel.dispose();
mprPanel = new MPRDialogPairwiseCriteriaComposite(rightColumn, SWT.NONE | SWT.NO_BACKGROUND);
mprPanel.setElements(mpr, gdmpService.getSelection().getCriteria());
mprPanel.setEditable(true);
} else {
mprPanel.setEditable(false);
}
}
private void createHeader(Composite panel, String message, String icon) {
Composite header = new Composite(panel, SWT.NONE);
GridDataFactory
.fillDefaults()
.grab(true, false)
.applyTo(header);
GridLayoutFactory
.fillDefaults()
.numColumns(2)
.applyTo(header);
Label image = new Label(header, SWT.NONE);
image.setImage(ResourceManager.getPluginImage(PLUGIN_ID, icon));
GridDataFactory
.swtDefaults()
.indent(5, 5)
.applyTo(image);
Label label = new Label(header, SWT.NONE);
label.setText(message + " "); //$NON-NLS-1$
GridDataFactory
.swtDefaults()
.indent(5, 0)
.applyTo(label);
}
private TableViewer createViewer(Composite panel, String prefix, String element) {
Composite viewerComposite = new Composite(panel, SWT.NONE);
GridDataFactory
.fillDefaults()
.grab(true, true)
.applyTo(viewerComposite);
tableLayout = new TableColumnLayout();
viewerComposite.setLayout(tableLayout);
TableViewer viewer = new TableViewer(viewerComposite, SWT.LEFT | SWT.FULL_SELECTION);
viewer.setContentProvider(ArrayContentProvider.getInstance());
createViewerColumns(viewer, prefix, element);
setViewerDesign(viewer);
return viewer;
}
private void createViewerColumns(TableViewer viewer, String prefix, String elementType) {
createTableViewerColumn(viewer, messages.id, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return (element != null) ? prefix + (getInput(elementType).indexOf(element) + 1) : null;
}
});
createTableViewerColumn(viewer, messages.name, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if(element instanceof String) {
return (String) element;
}
return "";
}
});
}
private void createTableViewerColumn(TableViewer viewer, String text, ColumnLabelProvider provider) {
TableViewerColumn tableViewerColumn = new TableViewerColumn(viewer, SWT.LEFT);
tableViewerColumn.setLabelProvider(provider);
TableColumn tableColumn = tableViewerColumn.getColumn();
tableColumn.setResizable(false);
tableColumn.setText(text);
}
private void setViewerDesign(TableViewer viewer) {
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
private void layoutTableColumns(TableViewer viewer) {
TableColumn[] columns = viewer.getTable().getColumns();
Arrays.stream(columns).forEach(TableColumn::pack);
Integer[] widths = Arrays.stream(columns).map(TableColumn::getWidth).toArray(Integer[]::new);
tableLayout.setColumnData(columns[0], new ColumnWeightData(0, Math.max(30, widths[0] + 10)));
tableLayout.setColumnData(columns[1], new ColumnWeightData(100, widths[1]));
}
@SuppressWarnings("unchecked")
private List<String> getInput(String elementType) {
if(gdmpService.getSelection() == null) {
return new ArrayList<>();
} else {
return (List<String>) gdmpService.getSelection().get(elementType);
}
}
private void createRightColumn() {
rightColumn = new Composite(containerTwoColumns, SWT.BORDER);
rightColumn.setLayout(new GridLayout(1, true));
rightColumn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
createMPRPanel();
}
private void createMPRPanel() {
mprPanel = new MPRDialogPairwiseCriteriaComposite(rightColumn, SWT.NONE | SWT.NO_BACKGROUND);
MPR mpr = new MPR(gdmpService.getSelection().getCriteria().size());
mprPanel.setElements(mpr, gdmpService.getSelection().getCriteria());
mprPanel.setEditable(false);
}
private void createButtonsComposite() {
Composite buttonsComposite = new Composite(container, SWT.NONE);
buttonsComposite.setLayout(new GridLayout(2, true));
buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Button exportButton = new Button(buttonsComposite, SWT.NONE);
exportButton.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, false, true));
exportButton.setText(MessageFormat.format(messages.export_x, messages.pairwise_matrices.toLowerCase()));
exportButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = createFileSaveDialog();
String fileName = dlg.open();
if(fileName != null) {
writeProfiles(fileName);
}
}
private void writeProfiles(String fileName) {
StringBuilder content = new StringBuilder();
for(Integer expert: pairwiseMatrices.keySet()) {
content.append(expert + ">" + pairwiseMatrices.get(expert).toString());
content.append(System.getProperty("line.separator"));
}
content.deleteCharAt(content.length() - 1);
content.deleteCharAt(content.length() - 1);
saveToFile(fileName, content);
}
private void saveToFile(String fileName, StringBuilder content) {
PrintWriter writer;
try {
writer = new PrintWriter(fileName, "UTF-8");
writer.println(content.toString());
writer.close();
} catch (FileNotFoundException | UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
});
Button importButton = new Button(buttonsComposite, SWT.NONE);
importButton.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, false, true));
importButton.setText(MessageFormat.format(messages.import_x, messages.pairwise_matrices.toLowerCase()));
importButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String fileName = createFileLoadDialog();
if(fileName != null) {
readProfiles(fileName);
}
}
private void readProfiles(String fileName) {
pairwiseMatrices.clear();
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(fileName);
br = new BufferedReader(fr);
String sCurrentLine;
int exp;
String mpr;
MPRParser textForGenerateMPR;
while ((sCurrentLine = br.readLine()) != null) {
String[] info = sCurrentLine.split(">");
exp = Integer.parseInt(info[0]);
mpr = info[1];
textForGenerateMPR = MPRParser.discover(mpr);
pairwiseMatrices.put(exp, textForGenerateMPR.parse(mpr));
}
mprPanel.redrawTable();
setSelection();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void setSelection() {
int selection = 0;
if(expertsViewer.getTable().getSelectionIndex() != -1) {
selection = expertsViewer.getTable().getSelectionIndex();
}
expertsViewer.setSelection(new StructuredSelection(expertsViewer.getElementAt(selection)), true);
}
});
}
private FileDialog createFileSaveDialog() {
FileDialog dlg = new FileDialog(getShell(), SWT.SAVE);
dlg.setFilterNames(FILTER_NAMES);
dlg.setFilterExtensions(FILTER_EXTS);
return dlg;
}
private String createFileLoadDialog() {
FileDialog dlg = new FileDialog(getShell(), SWT.OPEN);
dlg.setFilterNames(FILTER_NAMES);
dlg.setFilterExtensions(FILTER_EXTS);
return dlg.open();
}
@Override
protected void okPressed() {
super.okPressed();
}
public static Map<Integer, MPR> getPairwiseCriteria() {
return pairwiseMatrices;
}
}
@@ -0,0 +1,670 @@
package afryca.consensusmodel.ishizaka2018.dialog;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.wb.swt.ResourceManager;
import afryca.consensusmodel.Configuration;
import afryca.consensusmodel.ishizaka2018.IParametersIDs;
import afryca.consensusmodel.ishizaka2018.icons.Icons;
import afryca.consensusmodel.ishizaka2018.l10n.Messages;
import afryca.consensusmodel.service.IConsensusModelService;
import afryca.gdmp.GDMP;
import afryca.gdmp.service.IGDMPService;
import afryca.mpr.MPR;
import afryca.mpr.MPRParser;
import afryca.mpr.gui.composite.MPRDialogPairwiseAlternativesProfilesComposite;
import afryca.structure.pair.Quadruple;
public class PairwiseLimitingProfilesAlternativesDialog extends TitleAreaDialog {
private static final String PLUGIN_ID = "afryca.consensusmodel.ishizaka2018"; //$NON-NLS-1$
private static final String DIALOG_CLASS_SHELL = "DialogClassShell"; //$NON-NLS-1$
private static final String TABLE_VIEWER_CLASS_COMPOSITE = "TableViewerClassComposite"; //$NON-NLS-1$
private static final String[] FILTER_NAMES = { "txt files (*.txt)" }; //$NON-NLS-1$
private static final String[] FILTER_EXTS = { "*.txt" }; //$NON-NLS-1$
private static final String LIMITING_PROFILE_PREFIX = "p";
public static final String FIELD_LIMITING_PROFILE = "lim_profile";
public static final String FIELD_CENTRAL_PROFILE = "cen_profile";
private static final Integer TABLE_HEIGHT = 180;
private static final Integer TABLE_WIDTH = 200;
private Composite container;
private Composite containerTwoColumns;
private Composite leftColumn;
private Composite rightColumn;
private Composite expertsPanel;
private Composite criteriaPanel;
private Composite alternativesPanel;
private Composite limitingProfilePanel;
private MPRDialogPairwiseAlternativesProfilesComposite mprPanel;
private Composite buttonsPanel;
private TableViewer expertsViewer;
private TableViewer criteriaViewer;
private TableViewer alternativesViewer;
private TableViewer profilesViewer;
private List<String> profiles;
private int numberOfProfiles;
private Configuration configuration;
private GDMP gdmp;
@Inject
private IConsensusModelService consensusModelService;
@Inject
private IGDMPService gdmpService;
@Inject
private IStylingEngine engine;
@Translation
@Inject
private Messages messages;
@Translation
@Inject
private Icons icons;
//<Expert, Criterion, Alternative, Profile> MPR>
private static Map<Quadruple<Integer, Integer, Integer, Integer>, MPR> pairwiseMatrices;
public PairwiseLimitingProfilesAlternativesDialog() {
super(null);
pairwiseMatrices = new LinkedHashMap<>();
profiles = new LinkedList<>();
}
public PairwiseLimitingProfilesAlternativesDialog(Shell parentShell) {
super(parentShell);
pairwiseMatrices = new LinkedHashMap<>();
profiles = new LinkedList<>();
}
@Override
protected Control createDialogArea(Composite parent) {
container = (Composite) super.createDialogArea(parent);
GridLayoutFactory.fillDefaults().margins(0, 0).applyTo(container);
styleDialog();
if(gdmpService.getSelection() != null) {
configuration = consensusModelService.getConfiguration();
checkConditionsInitializePairwise();
createControls();
}
return container;
}
private void styleDialog() {
engine.setClassname(getShell(), DIALOG_CLASS_SHELL);
getShell().setText(messages.pairwise_comparison_profiles);
setTitleImage(ResourceManager.getPluginImage(PLUGIN_ID, icons.pairwise));
setTitle(messages.pairwise_comparison_profiles);
setMessage(messages.introduce_pairswise_profiles, SWT.NONE);
}
private void checkConditionsInitializePairwise() {
if(gdmp == null) {
initializePairwaiseMatrices();
} else {
if(!gdmp.getSimpleName().equals(gdmpService.getSelection().getSimpleName())) {
initializePairwaiseMatrices();
} else {
changesPairwaiseMatrices();
}
}
}
private void initializePairwaiseMatrices() {
boolean centralProfiles = (Boolean) configuration.getValue(IParametersIDs.CENTRAL_PROFILES);
int numberOfClasses = ((String[]) configuration.getValue(IParametersIDs.CLASSES)).length;
numberOfProfiles = (centralProfiles) ? numberOfClasses: numberOfClasses - 1;
setProfiles(centralProfiles);
gdmp = gdmpService.getSelection();
for(int expert = 0; expert < gdmp.getExperts().size(); ++expert) {
for(int criterion = 0; criterion < gdmp.getCriteria().size(); ++criterion) {
for(int alternative = 0; alternative < gdmp.getAlternatives().size(); ++alternative) {
for(int c = 0; c < numberOfProfiles; ++c) {
Quadruple<Integer, Integer, Integer, Integer> q = new Quadruple<Integer, Integer, Integer, Integer>(expert, criterion, alternative, c);
pairwiseMatrices.put(q, new MPR(2));
}
}
}
}
}
private void changesPairwaiseMatrices() {
boolean centralProfiles = (Boolean) configuration.getValue(IParametersIDs.CENTRAL_PROFILES);
int numberOfClasses = ((String[]) configuration.getValue(IParametersIDs.CLASSES)).length;
numberOfProfiles = (centralProfiles) ? numberOfClasses: numberOfClasses - 1;
setProfiles(centralProfiles);
GDMP gdmp = gdmpService.getSelection();
MPR mpr;
for(int expert = 0; expert < gdmp.getExperts().size(); ++expert) {
for(int criterion = 0; criterion < gdmp.getCriteria().size(); ++criterion) {
for(int alternative = 0; alternative < gdmp.getAlternatives().size(); ++alternative) {
for(int c = 0; c < numberOfProfiles; ++c) {
Quadruple<Integer, Integer, Integer, Integer> q = new Quadruple<Integer, Integer, Integer, Integer>(expert, criterion, alternative, c);
mpr = pairwiseMatrices.get(q);
pairwiseMatrices.put(q, (mpr == null) ? new MPR(2) : mpr);
}
}
}
}
}
private void setProfiles(boolean centralProfiles) {
profiles.clear();
for(int i = 0; i < numberOfProfiles; ++i) {
profiles.add((centralProfiles) ? FIELD_CENTRAL_PROFILE + (i+1) : FIELD_LIMITING_PROFILE + (i+1));
}
}
private void createControls() {
containerTwoColumns = new Composite(container, SWT.NONE);
GridLayoutFactory
.fillDefaults()
.numColumns(2)
.spacing(185, 0)
.applyTo(containerTwoColumns);
createLeftColumn();
createRightColumn();
}
private void createLeftColumn() {
leftColumn = new Composite(containerTwoColumns, SWT.BORDER);
leftColumn.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
leftColumn.setLayout(new GridLayout(1, true));
createExpertsPanel();
createCriteriaPanel();
createAlternativesPanel();
createLimitingProfilePanel();
}
private void createExpertsPanel() {
expertsPanel = new Composite(leftColumn, SWT.BORDER);
GridLayoutFactory
.fillDefaults()
.spacing(0, 0)
.numColumns(1)
.equalWidth(false)
.applyTo(expertsPanel);
GridDataFactory
.fillDefaults()
.grab(true, false)
.hint(TABLE_WIDTH, TABLE_HEIGHT)
.applyTo(expertsPanel);
engine.setClassname(expertsPanel, TABLE_VIEWER_CLASS_COMPOSITE);
createHeader(expertsPanel, messages.experts, icons.experts);
Composite viewerComposite = createViewerComposite(expertsPanel);
TableColumnLayout tableColumnLayout = createTableColumnLayout(viewerComposite);
expertsViewer = createViewer(viewerComposite, GDMP.EXPERT_PREFIX, GDMP.FIELD_EXPERTS);
expertsViewer.setInput(gdmpService.getSelection().getExperts().toArray());
layoutTableColumns(tableColumnLayout, expertsViewer);
expertsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelection();
}
});
}
private void checkSelection() {
if(expertsViewer.getTable().getSelectionIndex() != -1 && criteriaViewer.getTable().getSelectionIndex() != -1
&& alternativesViewer.getTable().getSelectionIndex() != -1 && profilesViewer.getTable().getSelectionIndex() != -1) {
MPR mpr = pairwiseMatrices.get(new Quadruple<Integer, Integer, Integer, Integer>(expertsViewer.getTable().getSelectionIndex(), criteriaViewer.getTable().getSelectionIndex(),
alternativesViewer.getTable().getSelectionIndex(), profilesViewer.getTable().getSelectionIndex()));
mprPanel.dispose();
buttonsPanel.dispose();
mprPanel = new MPRDialogPairwiseAlternativesProfilesComposite(rightColumn, SWT.NONE | SWT.NO_BACKGROUND);
mprPanel.setElements(mpr);
mprPanel.setEditable(true);
mprPanel.setSelectionIndexAlternative(alternativesViewer.getTable().getSelectionIndex());
mprPanel.setSelectionIndexProfile(profilesViewer.getTable().getSelectionIndex());
createButtonsComposite();
} else {
mprPanel.setEditable(false);
}
}
private void createHeader(Composite panel, String message, String icon) {
Composite header = new Composite(panel, SWT.NONE);
GridDataFactory
.fillDefaults()
.grab(true, false)
.applyTo(header);
GridLayoutFactory
.fillDefaults()
.numColumns(2)
.applyTo(header);
Label image = new Label(header, SWT.NONE);
image.setImage(ResourceManager.getPluginImage(PLUGIN_ID, icon));
GridDataFactory
.swtDefaults()
.indent(5, 5)
.applyTo(image);
Label label = new Label(header, SWT.NONE);
label.setText(message + " "); //$NON-NLS-1$
GridDataFactory
.swtDefaults()
.indent(5, 0)
.applyTo(label);
}
private Composite createViewerComposite(Composite panel) {
Composite viewerComposite = new Composite(panel, SWT.NONE);
GridDataFactory
.fillDefaults()
.grab(true, true)
.applyTo(viewerComposite);
return viewerComposite;
}
private TableColumnLayout createTableColumnLayout(Composite viewerComposite) {
TableColumnLayout tableLayout = new TableColumnLayout();
viewerComposite.setLayout(tableLayout);
return tableLayout;
}
private TableViewer createViewer(Composite viewerComposite, String prefix, String element) {
TableViewer viewer = new TableViewer(viewerComposite, SWT.LEFT | SWT.FULL_SELECTION);
viewer.setContentProvider(ArrayContentProvider.getInstance());
createViewerColumns(viewer, prefix, element);
setViewerDesign(viewer);
return viewer;
}
private void createViewerColumns(TableViewer viewer, String prefix, String elementType) {
createTableViewerColumn(viewer, messages.id, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return (element != null) ? prefix + (getInput(elementType).indexOf(element) + 1) : null;
}
});
createTableViewerColumn(viewer, messages.name, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if(element instanceof String) {
return (String) element;
}
return "";
}
});
}
private void createTableViewerColumn(TableViewer viewer, String text, ColumnLabelProvider provider) {
TableViewerColumn tableViewerColumn = new TableViewerColumn(viewer, SWT.LEFT);
tableViewerColumn.setLabelProvider(provider);
TableColumn tableColumn = tableViewerColumn.getColumn();
tableColumn.setResizable(false);
tableColumn.setText(text);
}
private void setViewerDesign(TableViewer viewer) {
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
private void layoutTableColumns(TableColumnLayout tableLayout, TableViewer viewer) {
TableColumn[] columns = viewer.getTable().getColumns();
Arrays.stream(columns).forEach(TableColumn::pack);
Integer[] widths = Arrays.stream(columns).map(TableColumn::getWidth).toArray(Integer[]::new);
tableLayout.setColumnData(columns[0], new ColumnWeightData(0, Math.max(30, widths[0] + 10)));
tableLayout.setColumnData(columns[1], new ColumnWeightData(100, widths[1]));
}
@SuppressWarnings("unchecked")
private List<String> getInput(String elementType) {
if(gdmpService.getSelection() == null) {
return new ArrayList<>();
} else {
if(gdmpService.getSelection().get(elementType) != null) {
return (List<String>) gdmpService.getSelection().get(elementType);
} else {
return profiles;
}
}
}
private void createCriteriaPanel() {
criteriaPanel = new Composite(leftColumn, SWT.BORDER);
GridLayoutFactory
.fillDefaults()
.spacing(0, 0)
.numColumns(1)
.equalWidth(false).applyTo(criteriaPanel);
GridDataFactory
.fillDefaults()
.hint(TABLE_WIDTH, TABLE_HEIGHT)
.grab(true, false)
.applyTo(criteriaPanel);
engine.setClassname(criteriaPanel, TABLE_VIEWER_CLASS_COMPOSITE);
createHeader(criteriaPanel, messages.criteria, icons.criteria);
Composite viewerComposite = createViewerComposite(criteriaPanel);
TableColumnLayout tableColumnLayout = createTableColumnLayout(viewerComposite);
criteriaViewer = createViewer(viewerComposite, GDMP.CRITERION_PREFIX, GDMP.FIELD_CRITERIA);
criteriaViewer.setInput(gdmpService.getSelection().getCriteria().toArray());
layoutTableColumns(tableColumnLayout, criteriaViewer);
criteriaViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelection();
}
});
}
private void createAlternativesPanel() {
alternativesPanel = new Composite(leftColumn, SWT.BORDER);
GridLayoutFactory
.fillDefaults()
.spacing(0, 0)
.numColumns(1)
.equalWidth(false).applyTo(alternativesPanel);
GridDataFactory
.fillDefaults()
.hint(TABLE_WIDTH, TABLE_HEIGHT)
.grab(true, false)
.applyTo(alternativesPanel);
engine.setClassname(alternativesPanel, TABLE_VIEWER_CLASS_COMPOSITE);
createHeader(alternativesPanel, messages.alternatives, icons.alternatives);
Composite viewerComposite = createViewerComposite(alternativesPanel);
TableColumnLayout tableColumnLayout = createTableColumnLayout(viewerComposite);
alternativesViewer = createViewer(viewerComposite, GDMP.ALTERNATIVE_PREFIX, GDMP.FIELD_ALTERNATIVES);
alternativesViewer.setInput(gdmpService.getSelection().getAlternatives().toArray());
layoutTableColumns(tableColumnLayout, alternativesViewer);
alternativesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelection();
}
});
}
private void createLimitingProfilePanel() {
limitingProfilePanel = new Composite(leftColumn, SWT.BORDER);
GridLayoutFactory
.fillDefaults()
.spacing(0, 0)
.numColumns(1)
.equalWidth(false).applyTo(limitingProfilePanel);
GridDataFactory
.fillDefaults()
.hint(TABLE_WIDTH, TABLE_HEIGHT)
.grab(true, false)
.applyTo(limitingProfilePanel);
engine.setClassname(limitingProfilePanel, TABLE_VIEWER_CLASS_COMPOSITE);
createHeader(limitingProfilePanel, messages.profiles, icons.profiles);
Composite viewerComposite = createViewerComposite(limitingProfilePanel);
TableColumnLayout tableColumnLayout = createTableColumnLayout(viewerComposite);
profilesViewer = createViewer(viewerComposite, LIMITING_PROFILE_PREFIX , FIELD_LIMITING_PROFILE);
profilesViewer.setInput(profiles.toArray());
layoutTableColumns(tableColumnLayout, profilesViewer);
profilesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelection();
}
});
}
private void createRightColumn() {
rightColumn = new Composite(containerTwoColumns, SWT.NONE);
GridLayoutFactory
.fillDefaults()
.applyTo(rightColumn);
createMPRPanel();
createButtonsComposite();
}
private void createMPRPanel() {
mprPanel = new MPRDialogPairwiseAlternativesProfilesComposite(rightColumn, SWT.NONE | SWT.NO_BACKGROUND);
GridDataFactory
.swtDefaults()
.align(SWT.FILL, SWT.FILL)
.grab(true, true)
.minSize(SWT.DEFAULT, 150)
.applyTo(mprPanel);
MPR mpr = new MPR(2);
mprPanel.setElements(mpr, gdmpService.getSelection().getAlternatives(), profiles);
mprPanel.setEditable(false);
}
private void createButtonsComposite() {
buttonsPanel = new Composite(rightColumn, SWT.NONE);
GridLayoutFactory
.fillDefaults()
.spacing(5, 0)
.numColumns(2)
.equalWidth(true)
.applyTo(buttonsPanel);
createExportButton();
createImportButton();
}
private void createExportButton() {
Button exportButton = new Button(buttonsPanel, SWT.NONE);
exportButton.setText(MessageFormat.format(messages.export_x, messages.pairwise_matrices.toLowerCase()));
exportButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = createFileSaveDialog();
String fileName = dlg.open();
if(fileName != null) {
writeProfiles(fileName);
}
}
private void writeProfiles(String fileName) {
StringBuilder content = new StringBuilder();
for(Quadruple<Integer, Integer, Integer, Integer> key: pairwiseMatrices.keySet()) {
content.append(key.getQ1() + ">" + key.getQ2() + ">" + key.getQ3() + ">" + key.getQ4() + ">" + pairwiseMatrices.get(key).toString());
content.append(System.getProperty("line.separator"));
}
content.deleteCharAt(content.length() - 1);
content.deleteCharAt(content.length() - 1);
saveToFile(fileName, content);
}
private void saveToFile(String fileName, StringBuilder content) {
PrintWriter writer;
try {
writer = new PrintWriter(fileName, "UTF-8");
writer.println(content.toString());
writer.close();
} catch (FileNotFoundException | UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
});
}
private FileDialog createFileSaveDialog() {
FileDialog dlg = new FileDialog(getShell(), SWT.SAVE);
dlg.setFilterNames(FILTER_NAMES);
dlg.setFilterExtensions(FILTER_EXTS);
return dlg;
}
private void createImportButton() {
Button importButton = new Button(buttonsPanel, SWT.NONE);
importButton.setText(MessageFormat.format(messages.import_x, messages.pairwise_matrices.toLowerCase()));
importButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String fileName = createFileLoadDialog();
if(fileName != null) {
readProfiles(fileName);
}
}
private void readProfiles(String fileName) {
pairwiseMatrices.clear();
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(fileName);
br = new BufferedReader(fr);
String sCurrentLine;
int exp, crit, alt, profile;
String mpr;
MPRParser textForGenerateMPR;
while ((sCurrentLine = br.readLine()) != null) {
String[] info = sCurrentLine.split(">");
exp = Integer.parseInt(info[0]);
crit = Integer.parseInt(info[1]);
alt = Integer.parseInt(info[2]);
profile = Integer.parseInt(info[3]);
mpr = info[4];
textForGenerateMPR = MPRParser.discover(mpr);
pairwiseMatrices.put(new Quadruple<Integer, Integer, Integer, Integer>(exp, crit, alt, profile), textForGenerateMPR.parse(mpr));
}
mprPanel.redrawTable();
setSelection();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void setSelection() {
int selectionExpert = 0, selectionCriterion = 0, selectionAlternative = 0, selectionProfile = 0;
if(expertsViewer.getTable().getSelectionIndex() != -1) {
selectionExpert = expertsViewer.getTable().getSelectionIndex();
}
if(criteriaViewer.getTable().getSelectionIndex() != -1) {
selectionCriterion = criteriaViewer.getTable().getSelectionIndex();
}
if(alternativesViewer.getTable().getSelectionIndex() != -1) {
selectionAlternative = alternativesViewer.getTable().getSelectionIndex();
}
if(profilesViewer.getTable().getSelectionIndex() != -1) {
selectionProfile = profilesViewer.getTable().getSelectionIndex();
}
expertsViewer.setSelection(new StructuredSelection(expertsViewer.getElementAt(selectionExpert)), true);
criteriaViewer.setSelection(new StructuredSelection(criteriaViewer.getElementAt(selectionCriterion)), true);
alternativesViewer.setSelection(new StructuredSelection(alternativesViewer.getElementAt(selectionAlternative)), true);
profilesViewer.setSelection(new StructuredSelection(profilesViewer.getElementAt(selectionProfile)), true);
}
});
}
private String createFileLoadDialog() {
FileDialog dlg = new FileDialog(getShell(), SWT.OPEN);
dlg.setFilterNames(FILTER_NAMES);
dlg.setFilterExtensions(FILTER_EXTS);
return dlg.open();
}
@Override
protected void okPressed() {
super.okPressed();
}
public static Map<Quadruple<Integer, Integer, Integer, Integer>, MPR> getPairwiseAlterativesProfiles() {
return pairwiseMatrices;
}
}
@@ -0,0 +1,468 @@
package afryca.consensusmodel.ishizaka2018.dialog;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.wb.swt.ResourceManager;
import afryca.consensusmodel.Configuration;
import afryca.consensusmodel.ishizaka2018.IParametersIDs;
import afryca.consensusmodel.ishizaka2018.composite.ProfilesComposite;
import afryca.consensusmodel.ishizaka2018.icons.Icons;
import afryca.consensusmodel.ishizaka2018.l10n.Messages;
import afryca.consensusmodel.service.IConsensusModelService;
import afryca.gdmp.GDMP;
import afryca.gdmp.service.IGDMPService;
import afryca.structure.pair.Triplet;
public class ProfilesDialog extends TitleAreaDialog {
private static final String PLUGIN_ID = "afryca.consensusmodel.ishizaka2018"; //$NON-NLS-1$
private static final String DIALOG_CLASS_SHELL = "DialogClassShell"; //$NON-NLS-1$
private static final String TABLE_VIEWER_CLASS_COMPOSITE = "TableViewerClassComposite"; //$NON-NLS-1$
private static final String[] FILTER_NAMES = { "txt files (*.txt)" }; //$NON-NLS-1$
private static final String[] FILTER_EXTS = { "*.txt" }; //$NON-NLS-1$
private Composite container;
private Composite containerTwoColumns;
private Composite leftColumn;
private Composite rightColumn;
private Composite expertsPanel;
private ProfilesComposite profilesPanel;
private TableViewer expertsViewer;
private TableColumnLayout tableLayout;
private int numberOfProfiles;
private Configuration configuration;
private GDMP gdmp;
@Inject
private IGDMPService gdmpService;
@Inject
private IConsensusModelService consensusModelService;
@Inject
private IStylingEngine engine;
@Translation
@Inject
private Messages messages;
@Translation
@Inject
private Icons icons;
//<Expert, Criterion, Class>, Limit
private static Map<Triplet<Integer, Integer, Integer>, Float> profiles;
public ProfilesDialog() {
super(null);
profiles = new LinkedHashMap<Triplet<Integer,Integer, Integer>, Float>();
}
public ProfilesDialog(Shell parentShell) {
super(parentShell);
profiles = new LinkedHashMap<Triplet<Integer,Integer, Integer>, Float>();
}
@Override
protected Control createDialogArea(Composite parent) {
container = (Composite) super.createDialogArea(parent);
GridLayoutFactory.fillDefaults().margins(0, 0).applyTo(container);
styleDialog();
if(gdmpService.getSelection() != null) {
configuration = consensusModelService.getConfiguration();
checkConditionsInitializeProfiles();
createControls();
}
return container;
}
private void checkConditionsInitializeProfiles() {
if(gdmp == null) {
initializeProfiles();
} else {
if(!gdmp.getSimpleName().equals(gdmpService.getSelection().getSimpleName())) {
initializeProfiles();
} else {
changesProfiles();
}
}
}
private void styleDialog() {
engine.setClassname(getShell(), DIALOG_CLASS_SHELL);
getShell().setText(messages.profiles);
setTitleImage(ResourceManager.getPluginImage(PLUGIN_ID, icons.profiles_dialog));
setTitle(messages.profiles);
setMessage(messages.introduce_profiles, SWT.NONE);
}
private void initializeProfiles() {
boolean centralProfiles = (Boolean) configuration.getValue(IParametersIDs.CENTRAL_PROFILES);
int numberOfClasses = ((String[]) configuration.getValue(IParametersIDs.CLASSES)).length;
numberOfProfiles = (centralProfiles) ? numberOfClasses: numberOfClasses - 1;
gdmp = gdmpService.getSelection();
for(int expert = 0; expert < gdmp.getExperts().size(); ++expert) {
for(int criterion = 0; criterion < gdmp.getCriteria().size(); ++criterion) {
for(int cl = 0; cl < numberOfProfiles; cl++) {
Triplet<Integer, Integer, Integer> triplet = new Triplet<Integer, Integer, Integer>(expert, criterion, cl);
profiles.put(triplet, 0.0f);
}
}
}
}
private void changesProfiles() {
boolean centralProfiles = (Boolean) configuration.getValue(IParametersIDs.CENTRAL_PROFILES);
int numberOfClasses = ((String[]) configuration.getValue(IParametersIDs.CLASSES)).length;
numberOfProfiles = (centralProfiles) ? numberOfClasses: numberOfClasses - 1;
gdmp = gdmpService.getSelection();
Float profile;
for(int expert = 0; expert < gdmp.getExperts().size(); ++expert) {
for(int criterion = 0; criterion < gdmp.getCriteria().size(); ++criterion) {
for(int cl = 0; cl < numberOfProfiles; cl++) {
Triplet<Integer, Integer, Integer> triplet = new Triplet<Integer, Integer, Integer>(expert, criterion, cl);
profile = profiles.get(triplet);
profiles.put(triplet, (profile == null) ? 0.0f : profile);
}
}
}
}
private void createControls() {
containerTwoColumns = new Composite(container, SWT.NONE);
GridLayout gridLayout = new GridLayout(2, false);
containerTwoColumns.setLayout(gridLayout);
GridData gridDataParent = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
containerTwoColumns.setLayoutData(gridDataParent);
createLeftColumn();
createRightColumn();
createButtonsComposite();
}
private void createLeftColumn() {
leftColumn = new Composite(containerTwoColumns, SWT.BORDER);
leftColumn.setLayout(new GridLayout(1, true));
GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
leftColumn.setLayoutData(gd);
createExpertsPanel();
}
private void createExpertsPanel() {
expertsPanel = new Composite(leftColumn, SWT.NONE);
expertsPanel.setLayout(new GridLayout(1, true));
expertsPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
engine.setClassname(expertsPanel, TABLE_VIEWER_CLASS_COMPOSITE);
createHeader(expertsPanel, messages.experts, icons.experts);
expertsViewer = createViewer(expertsPanel, GDMP.EXPERT_PREFIX, GDMP.FIELD_EXPERTS);
expertsViewer.setInput(gdmpService.getSelection().getExperts().toArray());
layoutTableColumns(expertsViewer);
expertsViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
checkSelection();
}
});
}
private void checkSelection() {
if(expertsViewer.getTable().getSelectionIndex() != -1) {
profilesPanel.dispose();
profilesPanel = new ProfilesComposite(rightColumn, SWT.NONE | SWT.NO_BACKGROUND);
profilesPanel.setElements(gdmpService.getSelection(), numberOfProfiles, profiles, gdmpService.getSelection().getCriteria(),
(String[]) configuration.getValue(IParametersIDs.CLASSES));
profilesPanel.setEditable(true);
profilesPanel.setSelectionIndexExpert(expertsViewer.getTable().getSelectionIndex());
} else {
profilesPanel.setEditable(false);
}
}
private void createHeader(Composite panel, String message, String icon) {
Composite header = new Composite(panel, SWT.NONE);
GridDataFactory
.fillDefaults()
.grab(true, false)
.applyTo(header);
GridLayoutFactory
.fillDefaults()
.numColumns(2)
.applyTo(header);
Label image = new Label(header, SWT.NONE);
image.setImage(ResourceManager.getPluginImage(PLUGIN_ID, icon));
GridDataFactory
.swtDefaults()
.indent(5, 5)
.applyTo(image);
Label label = new Label(header, SWT.NONE);
label.setText(message + " "); //$NON-NLS-1$
GridDataFactory
.swtDefaults()
.indent(5, 0)
.applyTo(label);
}
private TableViewer createViewer(Composite panel, String prefix, String element) {
Composite viewerComposite = new Composite(panel, SWT.NONE);
GridDataFactory
.fillDefaults()
.grab(true, true)
.applyTo(viewerComposite);
tableLayout = new TableColumnLayout();
viewerComposite.setLayout(tableLayout);
TableViewer viewer = new TableViewer(viewerComposite, SWT.LEFT | SWT.FULL_SELECTION);
viewer.setContentProvider(ArrayContentProvider.getInstance());
createViewerColumns(viewer, prefix, element);
setViewerDesign(viewer);
return viewer;
}
private void createViewerColumns(TableViewer viewer, String prefix, String elementType) {
createTableViewerColumn(viewer, messages.id, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return (element != null) ? prefix + (getInput(elementType).indexOf(element) + 1) : null;
}
});
createTableViewerColumn(viewer, messages.name, new ColumnLabelProvider() {
@Override
public String getText(Object element) {
if(element instanceof String) {
return (String) element;
}
return "";
}
});
}
private void createTableViewerColumn(TableViewer viewer, String text, ColumnLabelProvider provider) {
TableViewerColumn tableViewerColumn = new TableViewerColumn(viewer, SWT.LEFT);
tableViewerColumn.setLabelProvider(provider);
TableColumn tableColumn = tableViewerColumn.getColumn();
tableColumn.setResizable(false);
tableColumn.setText(text);
}
private void setViewerDesign(TableViewer viewer) {
Table table = viewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
}
private void layoutTableColumns(TableViewer viewer) {
TableColumn[] columns = viewer.getTable().getColumns();
Arrays.stream(columns).forEach(TableColumn::pack);
Integer[] widths = Arrays.stream(columns).map(TableColumn::getWidth).toArray(Integer[]::new);
tableLayout.setColumnData(columns[0], new ColumnWeightData(0, Math.max(30, widths[0] + 10)));
tableLayout.setColumnData(columns[1], new ColumnWeightData(100, widths[1]));
}
@SuppressWarnings("unchecked")
private List<String> getInput(String elementType) {
if(gdmpService.getSelection() == null) {
return new ArrayList<>();
} else {
return (List<String>) gdmpService.getSelection().get(elementType);
}
}
private void createRightColumn() {
rightColumn = new Composite(containerTwoColumns, SWT.BORDER);
rightColumn.setLayout(new GridLayout(1, true));
rightColumn.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
createProfilesPanel();
}
private void createProfilesPanel() {
profilesPanel = new ProfilesComposite(rightColumn, SWT.NONE | SWT.NO_BACKGROUND);
profilesPanel.setElements(gdmpService.getSelection(), numberOfProfiles, profiles, gdmpService.getSelection().getCriteria(),
(String[]) configuration.getValue(IParametersIDs.CLASSES));
profilesPanel.setEditable(false);
}
private void createButtonsComposite() {
Composite buttonsComposite = new Composite(container, SWT.NONE);
buttonsComposite.setLayout(new GridLayout(2, true));
buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
Button exportButton = new Button(buttonsComposite, SWT.NONE);
exportButton.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, false, true));
exportButton.setText(MessageFormat.format(messages.export_x, messages.profiles.toLowerCase()));
exportButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dlg = createFileSaveDialog();
String fileName = dlg.open();
if(fileName != null) {
writeProfiles(fileName);
}
}
private void writeProfiles(String fileName) {
StringBuilder content = new StringBuilder();
for(Triplet<Integer, Integer, Integer> key: profiles.keySet()) {
content.append(key.getT1() + ":" + key.getT2() + ":" + key.getT3() + ":" + profiles.get(key));
content.append(System.getProperty("line.separator"));
}
content.deleteCharAt(content.length() - 1);
content.deleteCharAt(content.length() - 1);
saveToFile(fileName, content);
}
private void saveToFile(String fileName, StringBuilder content) {
PrintWriter writer;
try {
writer = new PrintWriter(fileName, "UTF-8");
writer.println(content.toString());
writer.close();
} catch (FileNotFoundException | UnsupportedEncodingException e1) {
e1.printStackTrace();
}
}
});
Button importButton = new Button(buttonsComposite, SWT.NONE);
importButton.setLayoutData(new GridData(SWT.LEFT, SWT.LEFT, false, true));
importButton.setText(MessageFormat.format(messages.import_x, messages.profiles.toLowerCase()));
importButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
String fileName = createFileLoadDialog();
if(fileName != null) {
readProfiles(fileName);
}
}
private void readProfiles(String fileName) {
profiles.clear();
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(fileName);
br = new BufferedReader(fr);
String sCurrentLine;
int exp, crit, cl;
float profile;
while ((sCurrentLine = br.readLine()) != null) {
String[] info = sCurrentLine.split(":");
exp = Integer.parseInt(info[0]);
crit = Integer.parseInt(info[1]);
cl = Integer.parseInt(info[2]);
profile = Float.parseFloat(info[3]);
profiles.put(new Triplet<Integer, Integer, Integer>(exp, crit, cl), profile);
}
profilesPanel.redrawTable();
setSelection();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (fr != null)
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private void setSelection() {
int selection = 0;
if(expertsViewer.getTable().getSelectionIndex() != -1) {
selection = expertsViewer.getTable().getSelectionIndex();
}
expertsViewer.setSelection(new StructuredSelection(expertsViewer.getElementAt(selection)), true);
}
});
}
private FileDialog createFileSaveDialog() {
FileDialog dlg = new FileDialog(getShell(), SWT.SAVE);
dlg.setFilterNames(FILTER_NAMES);
dlg.setFilterExtensions(FILTER_EXTS);
return dlg;
}
private String createFileLoadDialog() {
FileDialog dlg = new FileDialog(getShell(), SWT.OPEN);
dlg.setFilterNames(FILTER_NAMES);
dlg.setFilterExtensions(FILTER_EXTS);
return dlg.open();
}
@Override
protected void okPressed() {
super.okPressed();
}
public static Map<Triplet<Integer, Integer, Integer>, Float> getProfiles() {
return profiles;
}
}
@@ -0,0 +1,16 @@
package afryca.consensusmodel.ishizaka2018.icons;
/**
* Localized icons
*
* @author Sinbad²
* @version 3.0
*/
public class Icons {
public String pairwise;
public String experts;
public String criteria;
public String alternatives;
public String profiles;
public String profiles_dialog;
}
@@ -0,0 +1,6 @@
pairwise=icons/pairwise.png
experts=icons/experts.png
criteria=icons/criteria.png
alternatives=icons/alternatives.png
profiles=icons/profiles.png
profiles_dialog=icons/profiles_dialog.png
@@ -0,0 +1,20 @@
package afryca.consensusmodel.ishizaka2018.l10n;
public class Messages {
public String alternatives;
public String class_x;
public String criteria;
public String experts;
public String export_x;
public String import_x;
public String font_table;
public String id;
public String introduce_pairswise_profiles;
public String introduce_pairswise_criteria;
public String introduce_profiles;
public String name;
public String pairwise_comparison_criteria;
public String pairwise_comparison_profiles;
public String pairwise_matrices;
public String profiles;
}
@@ -0,0 +1,16 @@
alternatives=Alternatives
class_x = class
criteria=Criteria
experts=Experts
export_x=Export {0}
import_x=Import {0}
font_table=Cantarell
id=Id
introduce_pairswise_criteria=Introduce pairwise criteria comparison
introduce_pairswise_profiles=Introduce pairwise comparison alternatives-limiting profiles
introduce_profiles=Introduce profiles
name=Name
pairwise_comparison_criteria=Pairwise criteria comparison
pairwise_comparison_profiles=Pairwise comparison alternatives-limiting profiles
pairwise_matrices=Matrices
profiles=Profiles
@@ -0,0 +1,16 @@
alternatives=Alternativas
class_x = clase
criteria=Criterios
experts=Expertos
export_x=Exportar {0}
import_x=Importar {0}
font_table=Cantarell
id=Id
introduce_pairswise_criteria=Introducir matrices de comparación a pares de criterios
introduce_pairswise_profiles=Introducir matrices de comparación a pares alternativas-perfiles
introduce_profiles=Introducir perfiles
name=Nombre
pairwise_comparison_criteria=Matrices de comparación a pares de criterios
pairwise_comparison_profiles=Matrices de comparación a pares alternativas-perfiles
pairwise_matrices=Matrices
profiles=Perfiles
@@ -0,0 +1,325 @@
package afryca.consensusmodel.ishizaka2018.provider;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
import org.eclipse.e4.core.di.annotations.Optional;
import org.eclipse.e4.core.services.nls.Translation;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.wb.swt.ResourceManager;
import org.eclipse.wb.swt.SWTResourceManager;
import afryca.consensusmodel.ishizaka2018.dialog.PairwiseLimitingProfilesAlternativesDialog;
import afryca.consensusmodel.ishizaka2018.l10n.Messages;
import afryca.gdmp.GDMP;
import afryca.structure.pair.Triplet;
import de.kupzog.ktable.KTable;
import de.kupzog.ktable.KTableCellEditor;
import de.kupzog.ktable.KTableCellRenderer;
import de.kupzog.ktable.KTableDefaultModel;
import de.kupzog.ktable.SWTX;
import de.kupzog.ktable.editors.KTableCellEditorText;
import de.kupzog.ktable.renderers.FixedCellRenderer;
import de.kupzog.ktable.renderers.TextCellRenderer;
public class ProfilesContentProvider extends KTableDefaultModel {
public final static String PROVIDER_INFORMATION = "PROVIDER_INFORMATION"; //$NON-NLS-1$
public final static String ABBREVIATION_PREFIX_CRITERION = GDMP.CRITERION_PREFIX; //$NON-NLS-1$
public final static String ABBREVIATION_LIMITING_PROFILE_PREFIX_CLASS = PairwiseLimitingProfilesAlternativesDialog.FIELD_LIMITING_PROFILE; //$NON-NLS-1$
public final static String ABBREVIATION_CENTRAL_PROFILE_PREFIX_CLASS = PairwiseLimitingProfilesAlternativesDialog.FIELD_CENTRAL_PROFILE; //$NON-NLS-1$
public final static String SELECTION_INDEX_EXPERT = "selectionIndexExpert";
public final static String FONT_SIZE_KEY = "fontSize"; //$NON-NLS-1$
public final static String CELL_WIDTH_KEY_CRITERIA = "cellWidthCriteria"; //$NON-NLS-1$
public final static String CELL_WIDTH_KEY_PROFILES = "cellWidthProfiles"; //$NON-NLS-1$
public final static String CELL_HEIGHT_KEY = "cellHeight"; //$NON-NLS-1$
public final static String EDITABLE = "editable"; //$NON-NLS-1$
public final static String CRITERIA = "criteria"; //$NON-NLS-1$
public final static String CLASSES = "classes"; //$NON-NLS-1$
public final static String NUM_PROFILES = "num_profiles"; //$NON-NLS-1$
private TextCellRenderer textRenderer = new TextCellRenderer(TextCellRenderer.INDICATION_FOCUS | SWTX.EDIT_ON_KEY);
private FixedCellRenderer fixedRenderer = new FixedCellRenderer(FixedCellRenderer.STYLE_FLAT | SWT.BOLD);
private FixedCellRenderer fixedRenderersInTable = new FixedCellRenderer(FixedCellRenderer.STYLE_FLAT);
private TextCellRenderer selectedTextRenderer = new TextCellRenderer(TextCellRenderer.INDICATION_FOCUS | SWTX.EDIT_ON_KEY);
private FixedCellRenderer selectedFixedRenderer = new FixedCellRenderer(FixedCellRenderer.STYLE_FLAT | SWT.BOLD);
private FixedCellRenderer selectedFixedRenderersInTable = new FixedCellRenderer(FixedCellRenderer.STYLE_FLAT);
@Inject
@Named(FONT_SIZE_KEY)
private Integer fontSize;
@Inject
@Named(CELL_WIDTH_KEY_CRITERIA)
private Integer cellWidthCriteria;
@Inject
@Named(CELL_WIDTH_KEY_PROFILES)
private Integer cellWidthClasses;
@Inject
@Named(CELL_HEIGHT_KEY)
private Integer cellHeight;
@Inject
@Named(SELECTION_INDEX_EXPERT)
private int selection_index_expert;
@Inject
@Named(NUM_PROFILES)
private int numberOfProfiles;
@Inject
@Named(CRITERIA)
private List<String> criteria;
@Inject
@Named(CLASSES)
private List<String> classes;
@Inject
@Optional
@Named(PROVIDER_INFORMATION)
private Map<Triplet<Integer, Integer, Integer>, Float> experts_profiles;
@Inject
private KTable parent;
@Inject
@Translation
private Messages messages;
private Boolean editable;
@Inject
private void setEditable(@Optional @Named(EDITABLE) boolean editable) {
this.editable = editable;
parent.redraw();
}
@PostConstruct
public void configTheme() {
initialize();
setDesign();
}
private void setDesign() {
textRenderer.setForeground(ResourceManager.getColor(59,89,152));
textRenderer.setBackground(ResourceManager.getColor(255, 255, 255));
textRenderer.setAlignment(SWTX.ALIGN_HORIZONTAL_CENTER | SWTX.ALIGN_VERTICAL_CENTER);
textRenderer.setFont(SWTResourceManager.getFont(messages.font_table, fontSize, SWT.NORMAL));
fixedRenderer.setForeground(ResourceManager.getColor(255, 255, 255));
fixedRenderer.setBackground(ResourceManager.getColor(139,157,195));
fixedRenderer.setAlignment(SWTX.ALIGN_HORIZONTAL_CENTER | SWTX.ALIGN_VERTICAL_CENTER);
fixedRenderer.setFont(SWTResourceManager.getFont(messages.font_table, fontSize, SWT.BOLD));
fixedRenderersInTable.setForeground(ResourceManager.getColor(59,89,152));
fixedRenderersInTable.setBackground(ResourceManager.getColor(223,227,238));
fixedRenderersInTable.setAlignment(SWTX.ALIGN_HORIZONTAL_CENTER | SWTX.ALIGN_VERTICAL_CENTER);
fixedRenderersInTable.setFont(SWTResourceManager.getFont(messages.font_table, fontSize, SWT.NORMAL));
selectedTextRenderer.setForeground(ResourceManager.getColor(59,89,152));
selectedTextRenderer.setBackground(ResourceManager.getColor(206,217,238));
selectedTextRenderer.setAlignment(SWTX.ALIGN_HORIZONTAL_CENTER | SWTX.ALIGN_VERTICAL_CENTER);
selectedTextRenderer.setFont(SWTResourceManager.getFont(messages.font_table, fontSize, SWT.NORMAL));
selectedFixedRenderer.setForeground(ResourceManager.getColor(247,247,247));
selectedFixedRenderer.setBackground(ResourceManager.getColor(0,94,255));
selectedFixedRenderer.setAlignment(SWTX.ALIGN_HORIZONTAL_CENTER | SWTX.ALIGN_VERTICAL_CENTER);
selectedFixedRenderer.setFont(SWTResourceManager.getFont(messages.font_table, fontSize, SWT.BOLD));
selectedFixedRenderersInTable.setForeground(ResourceManager.getColor(59,89,152));
selectedFixedRenderersInTable.setBackground(ResourceManager.getColor(164,191,238));
selectedFixedRenderersInTable.setAlignment(SWTX.ALIGN_HORIZONTAL_CENTER | SWTX.ALIGN_VERTICAL_CENTER);
selectedFixedRenderersInTable.setFont(SWTResourceManager.getFont(messages.font_table, fontSize, SWT.NORMAL));
}
@Override
public Object doGetContentAt(int col, int row) {
if ((col == 0) && (row == 0)) {
return (numberOfProfiles != classes.size()) ? ABBREVIATION_LIMITING_PROFILE_PREFIX_CLASS: ABBREVIATION_CENTRAL_PROFILE_PREFIX_CLASS;
}
Object content;
try {
if (col == 0) {
content = setCriteriaAbbreviation(row);
} else if (row == 0) {
content = setClassesAbbreviation(col);
} else {
content = Float.toString(experts_profiles.get(new Triplet<Integer, Integer, Integer>(selection_index_expert, row - 1, col - 1)));
if ("NaN".equals(content.toString())) { //$NON-NLS-1$
content = ""; //$NON-NLS-1$
}
}
} catch (Exception e) {
content = ""; //$NON-NLS-1$
}
return content;
}
private String setCriteriaAbbreviation(int row) {
return ABBREVIATION_PREFIX_CRITERION + row;
}
private String setClassesAbbreviation(int col) {
return messages.class_x + " " + col;
}
@Override
public KTableCellEditor doGetCellEditor(int col, int row) {
if (isFixedCell(col, row)) {
return null;
}
return new KTableCellEditorText();
}
@Override
public void doSetContentAt(int col, int row, Object value) {
try {
String stringValue = ((String) value).trim();
if (stringValue.isEmpty()) {
stringValue = "NaN"; //$NON-NLS-1$
} else if(col > 0 && row > 0){
experts_profiles.put(new Triplet<Integer, Integer, Integer>(selection_index_expert, row - 1, col - 1), Float.parseFloat(stringValue));
}
parent.redraw();
} catch (NumberFormatException nfe) {
// Nothing to do
}
}
@Override
public int doGetRowCount() {
return criteria.size() + getFixedRowCount();
}
@Override
public int getFixedHeaderRowCount() {
return 1;
}
@Override
public int doGetColumnCount() {
return numberOfProfiles + getFixedColumnCount();
}
@Override
public int getFixedHeaderColumnCount() {
return 1;
}
@Override
public int getFixedSelectableRowCount() {
return 0;
}
@Override
public int getFixedSelectableColumnCount() {
return 0;
}
@Override
public boolean isColumnResizable(int col) {
return false;
}
@Override
public int getInitialFirstRowHeight() {
return cellHeight;
}
@Override
public boolean isRowResizable(int row) {
return false;
}
@Override
public int getRowHeightMinimum() {
return cellHeight;
}
@Override
public boolean isFixedCell(int col, int row) {
if (editable) {
if (col == 0) {
return true;
} else if (row < getFixedRowCount()) {
return true;
} else {
return false;
}
} else {
return true;
}
}
@Override
public boolean isHeaderCell(int col, int row) {
return isFixedCell(col, row);
}
@Override
public KTableCellRenderer doGetCellRenderer(int col, int row) {
boolean selectedElementRenderer = selectedElement(col, row);
if (isFixedCell(col, row)) {
if ((col < getFixedColumnCount()) || (row < getFixedRowCount())) {
return (selectedElementRenderer) ? selectedFixedRenderer : fixedRenderer;
}
return (selectedElementRenderer) ? selectedFixedRenderersInTable : fixedRenderersInTable;
}
return (selectedElementRenderer) ? selectedTextRenderer : textRenderer;
}
private boolean selectedElement(int col, int row) {
return false;
}
@Override
public Point doBelongsToCell(int col, int row) {
return null;
}
@Override
public int getInitialColumnWidth(int column) {
if(column == 0) {
return cellWidthCriteria;
} else {
return cellWidthClasses;
}
}
@Override
public int getInitialRowHeight(int arg0) {
return cellHeight;
}
@Override
public String doGetTooltipAt(int col, int row) {
if ((col == 0) && (row == 0)) {
return ""; //$NON-NLS-1$
} else if (col < getFixedColumnCount()) {
return criteria.get(row - 1);
} else if (row < getFixedRowCount()) {
return classes.get(col - 1);
} else {
return "";
}
}
}
@@ -0,0 +1,12 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: afryca.consensusmodel.ishizaka2018;singleton:=true
Bundle-Version: 1.0.0.202101221157
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: afryca.consensusmodel,afryca.mpr.gui,javax.inject,org.ec
lipse.jface,org.eclipse.wb.swt
Import-Package: org.apache.commons.math3.linear,org.eclipse.e4.core.serv
ices.nls,org.eclipse.e4.ui.services
Automatic-Module-Name: afryca.consensusmodel.ishizaka2018
@@ -0,0 +1,6 @@
pairwise=icons/pairwise.png
experts=icons/experts.png
criteria=icons/criteria.png
alternatives=icons/alternatives.png
profiles=icons/profiles.png
profiles_dialog=icons/profiles_dialog.png
@@ -0,0 +1,16 @@
alternatives=Alternatives
class_x = class
criteria=Criteria
experts=Experts
export_x=Export {0}
import_x=Import {0}
font_table=Cantarell
id=Id
introduce_pairswise_criteria=Introduce pairwise criteria comparison
introduce_pairswise_profiles=Introduce pairwise comparison alternatives-limiting profiles
introduce_profiles=Introduce profiles
name=Name
pairwise_comparison_criteria=Pairwise criteria comparison
pairwise_comparison_profiles=Pairwise comparison alternatives-limiting profiles
pairwise_matrices=Matrices
profiles=Profiles
@@ -0,0 +1,16 @@
alternatives=Alternativas
class_x = clase
criteria=Criterios
experts=Expertos
export_x=Exportar {0}
import_x=Importar {0}
font_table=Cantarell
id=Id
introduce_pairswise_criteria=Introducir matrices de comparación a pares de criterios
introduce_pairswise_profiles=Introducir matrices de comparación a pares alternativas-perfiles
introduce_profiles=Introducir perfiles
name=Nombre
pairwise_comparison_criteria=Matrices de comparación a pares de criterios
pairwise_comparison_profiles=Matrices de comparación a pares alternativas-perfiles
pairwise_matrices=Matrices
profiles=Perfiles
@@ -0,0 +1,4 @@
#Fri Jan 22 13:01:12 CET 2021
artifact.main=C\:\\Users\\\u00C1lvaro\\Workspaces\\afryca_2020\\afryca\\plugins\\afryca.consensusmodel.ishizaka2018\\target\\afryca.consensusmodel.ishizaka2018-1.0.0-SNAPSHOT.jar
artifact.attached.p2artifacts=C\:\\Users\\\u00C1lvaro\\Workspaces\\afryca_2020\\afryca\\plugins\\afryca.consensusmodel.ishizaka2018\\target\\p2artifacts.xml
artifact.attached.p2metadata=C\:\\Users\\\u00C1lvaro\\Workspaces\\afryca_2020\\afryca\\plugins\\afryca.consensusmodel.ishizaka2018\\target\\p2content.xml
@@ -0,0 +1,3 @@
artifactId=afryca.consensusmodel.ishizaka2018
groupId=afryca.group
version=1.0.0-SNAPSHOT
@@ -0,0 +1,13 @@
<?xml version='1.0' encoding='UTF-8'?>
<?artifactRepository version='1.1.0'?>
<artifacts size='1'>
<artifact classifier='osgi.bundle' id='afryca.consensusmodel.ishizaka2018' version='1.0.0.202101221157'>
<properties size='5'>
<property name='artifact.size' value='88536'/>
<property name='download.size' value='88536'/>
<property name='maven-groupId' value='afryca.group'/>
<property name='maven-artifactId' value='afryca.consensusmodel.ishizaka2018'/>
<property name='maven-version' value='1.0.0-SNAPSHOT'/>
</properties>
</artifact>
</artifacts>
@@ -0,0 +1,52 @@
<?xml version='1.0' encoding='UTF-8'?>
<units size='1'>
<unit id='afryca.consensusmodel.ishizaka2018' version='1.0.0.202101221157' generation='2'>
<update id='afryca.consensusmodel.ishizaka2018' range='[0.0.0,1.0.0.202101221157)' severity='0'/>
<properties size='6'>
<property name='es.Bundle-Name' value='Ishizaka2018'/>
<property name='df_LT.Bundle-Name' value='Ishizaka2018'/>
<property name='org.eclipse.equinox.p2.name' value='%Bundle-Name'/>
<property name='maven-groupId' value='afryca.group'/>
<property name='maven-artifactId' value='afryca.consensusmodel.ishizaka2018'/>
<property name='maven-version' value='1.0.0-SNAPSHOT'/>
</properties>
<provides size='6'>
<provided namespace='org.eclipse.equinox.p2.iu' name='afryca.consensusmodel.ishizaka2018' version='1.0.0.202101221157'/>
<provided namespace='osgi.bundle' name='afryca.consensusmodel.ishizaka2018' version='1.0.0.202101221157'/>
<provided namespace='osgi.identity' name='afryca.consensusmodel.ishizaka2018' version='1.0.0.202101221157'>
<properties size='1'>
<property name='type' value='osgi.bundle'/>
</properties>
</provided>
<provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
<provided namespace='org.eclipse.equinox.p2.localization' name='es' version='1.0.0'/>
<provided namespace='org.eclipse.equinox.p2.localization' name='df_LT' version='1.0.0'/>
</provides>
<requires size='9'>
<required namespace='osgi.bundle' name='afryca.consensusmodel' range='0.0.0'/>
<required namespace='osgi.bundle' name='afryca.mpr.gui' range='0.0.0'/>
<required namespace='osgi.bundle' name='javax.inject' range='0.0.0'/>
<required namespace='osgi.bundle' name='org.eclipse.jface' range='0.0.0'/>
<required namespace='osgi.bundle' name='org.eclipse.wb.swt' range='0.0.0'/>
<required namespace='java.package' name='org.apache.commons.math3.linear' range='0.0.0'/>
<required namespace='java.package' name='org.eclipse.e4.core.services.nls' range='0.0.0'/>
<required namespace='java.package' name='org.eclipse.e4.ui.services' range='0.0.0'/>
<requiredProperties namespace='osgi.ee' match='(&amp;(osgi.ee=JavaSE)(version=1.8))'>
<description>
afryca.consensusmodel.ishizaka2018
</description>
</requiredProperties>
</requires>
<artifacts size='1'>
<artifact classifier='osgi.bundle' id='afryca.consensusmodel.ishizaka2018' version='1.0.0.202101221157'/>
</artifacts>
<touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
<touchpointData size='1'>
<instructions size='1'>
<instruction key='manifest'>
Bundle-SymbolicName: afryca.consensusmodel.ishizaka2018;singleton:=true&#xA;Bundle-Version: 1.0.0.202101221157&#xA;
</instruction>
</instructions>
</touchpointData>
</unit>
</units>