Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
oskopek committed Aug 27, 2015
1 parent 7e7eeef commit c1281d8
Show file tree
Hide file tree
Showing 28 changed files with 601 additions and 596 deletions.
662 changes: 331 additions & 331 deletions pom.xml

Large diffs are not rendered by default.

29 changes: 13 additions & 16 deletions src/main/java/sk/gymy/seminar/app/SeminarApp.java
Expand Up @@ -60,11 +60,8 @@ public static void main(String[] args) throws IOException {
}

public SeminarApp() {
super("Seminar",
"Place seminars into groups.\n\n" +
"No 2 Students must have two seminars in one group.",
SeminarPanel.LOGO_PATH
);
super("Seminar", "Place seminars into groups.\n\n" + "No 2 Students must have two seminars in one group.",
SeminarPanel.LOGO_PATH);
}

@Override
Expand Down Expand Up @@ -96,19 +93,18 @@ protected Solver createSolverByApi() {
solverConfig.setEntityClassList(Collections.<Class<?>>singletonList(Seminar.class));

ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig();
scoreDirectorFactoryConfig.setScoreDefinitionType(ScoreDefinitionType.SIMPLE);
scoreDirectorFactoryConfig.setScoreDrlList(
Arrays.asList("sk/gymy/seminar/solver/seminarScoreRules.drl"));
scoreDirectorFactoryConfig.setScoreDefinitionType(ScoreDefinitionType.HARD_SOFT);
scoreDirectorFactoryConfig
.setScoreDrlList(Collections.singletonList("sk/gymy/seminar/solver/seminarScoreRules.drl"));
solverConfig.setScoreDirectorFactoryConfig(scoreDirectorFactoryConfig);

TerminationConfig terminationConfig = new TerminationConfig();
terminationConfig.setBestScoreLimit("0");
terminationConfig.setBestScoreLimit("0hard/0soft");
solverConfig.setTerminationConfig(terminationConfig);
List<PhaseConfig> phaseConfigList = new ArrayList<>();
ConstructionHeuristicPhaseConfig constructionHeuristicSolverPhaseConfig
= new ConstructionHeuristicPhaseConfig();
constructionHeuristicSolverPhaseConfig.setConstructionHeuristicType(
ConstructionHeuristicType.FIRST_FIT);
ConstructionHeuristicPhaseConfig constructionHeuristicSolverPhaseConfig =
new ConstructionHeuristicPhaseConfig();
constructionHeuristicSolverPhaseConfig.setConstructionHeuristicType(ConstructionHeuristicType.FIRST_FIT);
phaseConfigList.add(constructionHeuristicSolverPhaseConfig);
LocalSearchPhaseConfig localSearchPhaseConfig = new LocalSearchPhaseConfig();
ChangeMoveSelectorConfig changeMoveSelectorConfig = new ChangeMoveSelectorConfig();
Expand All @@ -133,8 +129,8 @@ protected SolutionDao createSolutionDao() {
}

@Override
protected AbstractSolutionImporter createSolutionImporter() {
return new SeminarImporter();
protected AbstractSolutionImporter[] createSolutionImporters() {
return new SeminarImporter[]{new SeminarImporter()};
}

@Override
Expand All @@ -148,6 +144,7 @@ protected AbstractSolutionExporter createSolutionExporter() {
* SeminarApp makes no assumptions about deleting them afterwards.
*
* @param baseDir must be a directory and must exists
* @throws IOException if failed to create the directory structure
*/
protected static void prepareDataDirStructure(File baseDir) throws IOException {
logger.info("BaseDir is: {}", baseDir);
Expand All @@ -158,7 +155,7 @@ protected static void prepareDataDirStructure(File baseDir) throws IOException {
String dataDirPath = baseDir.getPath() + "/data/" + SeminarDao.dataDirName + "/";
List<String> dataDirs = Arrays.asList("import", "export", "solved", "unsolved");
File dir;
for(String curDataDir : dataDirs) {
for (String curDataDir : dataDirs) {
dir = new File(dataDirPath + curDataDir);
if (!dir.exists()) {
logger.info("Data directory {} doesn't exist, creating it.", dir.toString());
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/sk/gymy/seminar/app/SeminarBenchmarkApp.java
Expand Up @@ -25,11 +25,9 @@ public static void main(String[] args) {
}

public SeminarBenchmarkApp() {
super(
new ArgOption("default", "sk/gymy/seminar/benchmark/seminarBenchmarkConfig.xml"),
super(new ArgOption("default", "sk/gymy/seminar/benchmark/seminarBenchmarkConfig.xml"),
new ArgOption("stepLimit", "sk/gymy/seminar/benchmark/seminarStepLimitBenchmarkConfig.xml"),
new ArgOption("scoreDirector", "sk/gymy/seminar/benchmark/seminarScoreDirectorBenchmarkConfig.xml")
);
new ArgOption("scoreDirector", "sk/gymy/seminar/benchmark/seminarScoreDirectorBenchmarkConfig.xml"));
}

}
10 changes: 7 additions & 3 deletions src/main/java/sk/gymy/seminar/app/SeminarHelloWorld.java
Expand Up @@ -26,16 +26,20 @@
import java.io.File;
import java.util.List;

public class SeminarHelloWorld {
public final class SeminarHelloWorld {

private SeminarHelloWorld() {
// intentionally empty
}

public static void main(String[] args) {
System.out.println(solveHelloWorld());
}

public static String solveHelloWorld() {
// Build the Solver
SolverFactory solverFactory = SolverFactory.createFromXmlResource(
"sk/gymy/seminar/solver/seminarSolverConfig.xml");
SolverFactory solverFactory =
SolverFactory.createFromXmlResource("sk/gymy/seminar/solver/seminarSolverConfig.xml");

String unsolved5SeminarPath = "data/seminar/import/simple5.sem";
Solver solver = solverFactory.buildSolver();
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/sk/gymy/seminar/domain/Group.java
Expand Up @@ -48,8 +48,12 @@ public String toString() {

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Group group = (Group) o;
return index == group.index;
}
Expand Down
17 changes: 9 additions & 8 deletions src/main/java/sk/gymy/seminar/domain/Person.java
Expand Up @@ -16,8 +16,8 @@

package sk.gymy.seminar.domain;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.optaplanner.examples.common.domain.AbstractPersistable;

public class Person extends AbstractPersistable {
Expand Down Expand Up @@ -58,14 +58,15 @@ public String toString() {

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

Person person = (Person) o;
return new EqualsBuilder()
.append(getName(), person.getName())
.append(getIndex(), person.getIndex())
.isEquals();
return new EqualsBuilder().append(getName(), person.getName()).append(getIndex(), person.getIndex()).isEquals();
}

@Override
Expand Down
24 changes: 13 additions & 11 deletions src/main/java/sk/gymy/seminar/domain/Seminar.java
Expand Up @@ -17,8 +17,8 @@
package sk.gymy.seminar.domain;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.optaplanner.core.api.domain.entity.PlanningEntity;
import org.optaplanner.core.api.domain.variable.PlanningVariable;
import org.optaplanner.examples.common.domain.AbstractPersistable;
Expand Down Expand Up @@ -56,7 +56,8 @@ public Seminar(int index, String name, boolean locked, Teacher teacher, List<Stu
this.group = group;
}

@PlanningVariable(valueRangeProviderRefs = {"groupRange"}, strengthWeightFactoryClass = GroupStrengthWeightFactory.class)
@PlanningVariable(valueRangeProviderRefs = {"groupRange"},
strengthWeightFactoryClass = GroupStrengthWeightFactory.class)
public Group getGroup() {
return group;
}
Expand Down Expand Up @@ -112,18 +113,19 @@ public String toString() {

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}

Seminar seminar = (Seminar) o;

return new EqualsBuilder() // do not append Group!
.append(getIndex(), seminar.getIndex())
.append(getName(), seminar.getName())
.append(getStudents(), seminar.getStudents())
.append(getTeacher(), seminar.getTeacher())
.append(isLocked(), seminar.isLocked())
.isEquals();
.append(getIndex(), seminar.getIndex()).append(getName(), seminar.getName())
.append(getStudents(), seminar.getStudents()).append(getTeacher(), seminar.getTeacher())
.append(isLocked(), seminar.isLocked()).isEquals();
}

@Override
Expand Down
Expand Up @@ -16,7 +16,7 @@

package sk.gymy.seminar.domain.solver;

import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.optaplanner.core.impl.heuristic.selector.common.decorator.SelectionSorterWeightFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -28,7 +28,7 @@

public class GroupStrengthWeightFactory implements SelectionSorterWeightFactory<Groups, Group> {

final private static Logger LOGGER = LoggerFactory.getLogger(GroupStrengthWeightFactory.class);
private static final Logger LOGGER = LoggerFactory.getLogger(GroupStrengthWeightFactory.class);

public Comparable createSorterWeight(Groups groups, Group group) {
int seminarCount = countSeminars(group, groups.getSeminarList());
Expand Down Expand Up @@ -67,11 +67,11 @@ public int getSeminarCount() {
return seminarCount;
}

public int compareTo(GroupStrengthWeight other) {
public int compareTo(GroupStrengthWeight other) { // TODO: non null
return new CompareToBuilder()
// The stronger groups are those with more seminars
.append(seminarCount, other.seminarCount)
.append(group.getIndex(), other.group.getIndex()) // Tie-breaker
.append(seminarCount, other.seminarCount).append(group.getIndex(),
other.group.getIndex()) // Tie-breaker
.toComparison();
}

Expand Down
Expand Up @@ -16,7 +16,7 @@

package sk.gymy.seminar.domain.solver;

import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.optaplanner.core.impl.heuristic.selector.common.decorator.SelectionSorterWeightFactory;
import sk.gymy.seminar.domain.Groups;
import sk.gymy.seminar.domain.Seminar;
Expand All @@ -37,11 +37,11 @@ public SeminarDifficultyWeight(Seminar seminar, int studentsCount) {
this.studentsCount = studentsCount;
}

public int compareTo(SeminarDifficultyWeight other) {
public int compareTo(SeminarDifficultyWeight other) { // TODO: non null
return new CompareToBuilder() // Decreasing order
// The more difficult seminars have a higher number of students
.append(other.studentsCount, studentsCount)
.append(other.seminar.getIndex(), seminar.getIndex()) // Tie-breaker
.append(other.studentsCount, studentsCount).append(other.seminar.getIndex(),
seminar.getIndex()) // Tie-breaker
.toComparison();
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/sk/gymy/seminar/persistence/SeminarDao.java
Expand Up @@ -21,7 +21,7 @@

public class SeminarDao extends XStreamSolutionDao {

final public static String dataDirName = "seminar";
public static final String dataDirName = "seminar";

public SeminarDao() {
super(dataDirName, Groups.class);
Expand Down
10 changes: 4 additions & 6 deletions src/main/java/sk/gymy/seminar/persistence/SeminarGenerator.java
Expand Up @@ -78,9 +78,7 @@ public Groups createGroups(int N, int studentN, int teacherN, int seminarN) {
groups.setGroupList(createGroupList(groups, groups.getN()));
groups.setSeminarList(createSeminarList(groups, seminarN));
logger.info("Seminar has {} Students, {} Seminars, {} Groups with a search space of {}.",
groups.getStudentList().size(),
groups.getSeminarList().size(),
groups.getGroupList().size(),
groups.getStudentList().size(), groups.getSeminarList().size(), groups.getGroupList().size(),
SeminarImporter.calculatePossibleSolutionSize(groups));
return groups;
}
Expand Down Expand Up @@ -134,11 +132,11 @@ private List<Seminar> createSeminarList(Groups groups, int seminarN) {
seminar.setLocked(false);
seminar.setName(base + i);

int numOfStudents = ((groups.getN()-1) * groups.getStudentList().size())/seminarN;
int numOfStudents = ((groups.getN() - 1) * groups.getStudentList().size()) / seminarN;
List<Student> students = generateStudents(groups.getStudentList(), numOfStudents, groups.getN());
seminar.setStudents(students);

if(teacherIndex >= groups.getTeacherList().size()) {
if (teacherIndex >= groups.getTeacherList().size()) {
teacherIndex = 0;
}
seminar.setTeacher(groups.getTeacherList().get(teacherIndex));
Expand All @@ -154,7 +152,7 @@ private List<Student> generateStudents(List<Student> studentList, int n, int gro
List<Student> students = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
int id = random.nextInt(studentList.size());
if(studentSeminars.count(id) >= groupN) {
if (studentSeminars.count(id) >= groupN) {
i--;
continue;
}
Expand Down
13 changes: 5 additions & 8 deletions src/main/java/sk/gymy/seminar/persistence/SeminarImporter.java
Expand Up @@ -50,7 +50,7 @@ public String getInputFileSuffix() {
public static String calculatePossibleSolutionSize(Groups groups) {
int seminarN = groups.getSeminarList().size();
int groupsN = groups.getN();
int n = groupsN*seminarN;
int n = groupsN * seminarN;
int k = seminarN;
BigInteger possibleSolutionSize = BigIntegerMath.binomial(n, k);
return getFlooredPossibleSolutionSize(possibleSolutionSize);
Expand All @@ -77,13 +77,10 @@ public Solution readSolution() throws IOException {
readTeacherList(groups, teachNum);
readStudentList(groups, studNum);
readSeminarList(groups, semNum);
logger.info("Seminar {} - {} - has {} Students, {} Teachers, {} Seminars, {} Groups with a search space of {}.",
getInputId(),
name,
groups.getStudentList().size(),
groups.getTeacherList().size(),
groups.getSeminarList().size(),
groups.getGroupList().size(),
logger.info(
"Seminar {} - {} - has {} Students, {} Teachers, {} Seminars, {} Groups with a search space of {}.",
getInputId(), name, groups.getStudentList().size(), groups.getTeacherList().size(),
groups.getSeminarList().size(), groups.getGroupList().size(),
calculatePossibleSolutionSize(groups));
return groups;
}
Expand Down
8 changes: 4 additions & 4 deletions src/main/java/sk/gymy/seminar/swingui/SeminarPanel.java
Expand Up @@ -121,8 +121,7 @@ public void actionPerformed(ActionEvent e) {
statsPanel.add(new JLabel("Students: "), BorderLayout.WEST);
statsPanel.add(new JLabel(Integer.toString(seminar.getStudents().size())), BorderLayout.CENTER);
statsPanel.add(new JLabel("Teacher: "), BorderLayout.WEST);
statsPanel.add(new JLabel(seminar.getTeacher().getName()),
BorderLayout.CENTER);
statsPanel.add(new JLabel(seminar.getTeacher().getName()), BorderLayout.CENTER);
tabbedPane.addTab("Statistics", statsPanel);

JPanel studentListPanel = new JPanel(new GridLayout(1, 1));
Expand All @@ -134,8 +133,9 @@ public void actionPerformed(ActionEvent e) {
studentListPanel.add(new JScrollPane(studentList), BorderLayout.CENTER);
tabbedPane.addTab("Students", studentListPanel);

int result = JOptionPane.showConfirmDialog(SeminarPanel.this.getRootPane(), tabbedPane,
"Seminar: " + seminar.getName(), JOptionPane.OK_CANCEL_OPTION);
int result = JOptionPane
.showConfirmDialog(SeminarPanel.this.getRootPane(), tabbedPane, "Seminar: " + seminar.getName(),
JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
Group toGroup = (Group) groupListField.getSelectedItem();
if (!toGroup.equals(seminar.getGroup())) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/logback.xml
Expand Up @@ -26,7 +26,7 @@
<logger name="sk.gymy.seminar" level="info"/>

<root level="info">
<appender-ref ref="consoleAppender" />
<appender-ref ref="consoleAppender"/>
</root>

</configuration>

0 comments on commit c1281d8

Please sign in to comment.