package genius.gui.uncertainty; import java.util.ArrayList; import java.util.List; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import genius.core.repository.ProfileRepItem; import genius.core.uncertainty.UNCERTAINTYTYPE; import genius.core.uncertainty.UncertainPreferenceContainer; import genius.core.uncertainty.flattening.FlattenedUtilitySpace; import genius.core.utility.AbstractUtilitySpace; import genius.core.utility.AdditiveUtilitySpace; import genius.gui.negosession.ContentProxy; import genius.gui.panels.SingleSelectionModel; import genius.gui.panels.SubsetSelectionModel; /** * @author Dimitrios Tsimpoukis * */ public class FlatteningModel { private final ProfileRepItem realProfileRepItem; private final SubsetSelectionModel multiPrefSelectionModel; private final SingleSelectionModel strategyNamesModel; public FlatteningModel(ProfileRepItem realProfileRepItem) { this.realProfileRepItem = realProfileRepItem; this.multiPrefSelectionModel = new SubsetSelectionModel(ContentProxy.fetchDomainSpecificProfiles(realProfileRepItem.getDomain())); // TODO need to rule out real this.strategyNamesModel = new SingleSelectionModel<>(getFlatteningStrategyNames()); } private static ArrayList getFlatteningStrategyNames() { ArrayList flatteningStrategiesNames = new ArrayList(); flatteningStrategiesNames.add("Average Flattening"); flatteningStrategiesNames.add("Weighted Average Flattening"); flatteningStrategiesNames.add("Random Flattening"); flatteningStrategiesNames.add("Weighted Choice Flattening"); return flatteningStrategiesNames; } /** * @return An UncertainPreferenceContainer object from the GUI selections */ public UncertainPreferenceContainer createContainer() { FlattenedUtilitySpace flattenedSpace = createFlattenedSpace(multiPrefSelectionModel.getSelectedItems()); return new UncertainPreferenceContainer((AdditiveUtilitySpace)realProfileRepItem.create(), UNCERTAINTYTYPE.PERCEIVEDUTILITY, flattenedSpace); } /** * IMPORTANT method takes as input a list of profile repository items and returns a flattened utility space. * @param itemsList * @return FlattenedUtilitySpace */ public FlattenedUtilitySpace createFlattenedSpace(List itemsList) { ArrayList uspacesList = new ArrayList(); for (ProfileRepItem repItem : itemsList) { uspacesList.add((AbstractUtilitySpace)repItem.create()); } double [] weights = getWeightsFromGUI(uspacesList.size()); FlattenedUtilitySpace flattenedSpace = new FlattenedUtilitySpace(uspacesList , uspacesList.get(0).getDomain() , weights , strategyNamesModel.getSelection()); System.out.println(flattenedSpace.getName()); return flattenedSpace; } /** * Receives the weights from the GUI for the creation of the flattened utility space * @param amount: the amount of preference profiles used for flattening * @return array of weights corresponding to the preference profiles */ public double [] getWeightsFromGUI(int amount) { JTextField [] weightsTextField = new JTextField [amount] ; double [] weights = new double [amount]; JPanel myPanel = new JPanel(); for (int i = 0; i < amount; i++) { if (i == 0) weightsTextField[i] = new JTextField("1",3); else weightsTextField[i] = new JTextField("1",3); myPanel.add(new JLabel("Profile " +(i+1) +" weight:")); myPanel.add(weightsTextField[i]); } int result = JOptionPane.showConfirmDialog(null, myPanel, "Please Enter Preference Profiles Weights", JOptionPane.OK_CANCEL_OPTION); if (result == JOptionPane.OK_OPTION) { for (int i = 0; i < amount; i++) { weights[i] = Double.parseDouble(weightsTextField[i].getText()); } return weights; } else {System.out.println("error parsing weights"); return getWeightsFromGUI(amount); } } public ProfileRepItem getRealProfileRepItem() { return realProfileRepItem; } public SingleSelectionModel getStrategyNamesModel() { return strategyNamesModel; } public SubsetSelectionModel getMultiPrefSelectionModel() { return multiPrefSelectionModel; } }