GithubHelp home page GithubHelp logo

iypt-planner's Introduction

IYPT Jury Planner

IYPT Jury Planner is a Java-based application with GUI that is used to fill juries for the International Young Physicists’ Tournament. It helps to quickly find a distribution of people to juries that not only complies to the tournament regulations but also satisfies various extra constraints without involving tedious manual work.

To learn more about IYPT competition, visit iypt.org.

Jury rules

There are a few basic rules for a jury that are implied by tournament regulations:

  1. Each jury has the same number of members.

  2. The role of jury chairman is occupied.

  3. Team leaders cannot be members of jury for a fight where their team participates.

  4. Any chairman cannot grade the same team more than twice.

On top of that, there are additional soft requirements, i.e. some nice-to-have properties of the distribution. For example:

  1. No juror should remain idle during the whole tournament. Juror workloads should be balanced.

  2. The rate of team leads and local jurors (provided by the Local Organizing Committee) should be balanced across all juries.

  3. The sum of biases of jurors in each jury should be balanced across all juries. Bias is a statistic based on historical data and describes a person’s tendency to be either nice or strict in grading the fighting teams.

Satisfying these requirements makes the juries “better”, therefore we aim to meet as much of them as possible. However many of them are contradictory so it is hard to meet one without breaking two others and it is usually impossible to meet all of them.

Jury optimization

You may have guessed that finding the best jury schedule is an example of optimization problem. The typical feature of such problems is that there is no effective algorithm for finding the best (optimal) solution. This is where metaheuristics weigh in. IYPT Jury Planner is powered by OptaPlanner, a software library which allows to write applications for optimizing real-life planning problems without having to re-implement metaheuristic algorithms.

iypt-planner's People

Contributors

falen avatar yurloc avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

iypt-planner's Issues

CSV export should not include observing jurors

Observing jurors can not be handled by newtoon. The csv should not include the 'observing jurors' as those aren't supported by newtoon (and are not needed there as their vote is not counted).

Arbitrary country names

The program must not rely on the assumption that input file will contain country names exactly as they are defined in CountryCode. Arbitrary country names must be accepted.

  • The corresponding country flag will be displayed automatically when a matching country definition is found (current state).
  • When the country name is not recognized, a default flag image will be used (for example IYPT logo).
  • User will be allowed to map custom country name to one of the existing built-in names to get the correct flag.
  • Nice to have: add possibility to use user-provided flags.

NPE when bestSolutionChanged

18:36:43.764 [AWT-EventQueue-0] ERROR org.iypt.planner.gui.PlannerWindow - Error during solution
java.lang.NullPointerException: null
    at org.iypt.planner.solver.TournamentSolver.updateDetails(TournamentSolver.java:255) ~[classes/:na]
    at org.iypt.planner.solver.TournamentSolver.setTournament(TournamentSolver.java:117) ~[classes/:na]
    at org.iypt.planner.gui.PlannerWindow$SolverListener.bestSolutionChanged(PlannerWindow.java:519) ~[classes/:na]
    at org.drools.planner.core.event.SolverEventSupport.fireBestSolutionChanged(SolverEventSupport.java:42) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.bestsolution.BestSolutionRecaller.updateBestSolution(BestSolutionRecaller.java:98) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.bestsolution.BestSolutionRecaller.stepEnded(BestSolutionRecaller.java:89) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.phase.AbstractSolverPhase.stepEnded(AbstractSolverPhase.java:84) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.localsearch.DefaultLocalSearchSolverPhase.stepEnded(DefaultLocalSearchSolverPhase.java:131) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.localsearch.DefaultLocalSearchSolverPhase.solve(DefaultLocalSearchSolverPhase.java:88) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:155) ~[drools-planner-core-5.5.0.Final.jar:5.5.0.Final]
    at org.iypt.planner.solver.TournamentSolver.solve(TournamentSolver.java:151) ~[classes/:na]
    at org.iypt.planner.gui.PlannerWindow$SolverTask.execute(PlannerWindow.java:546) ~[classes/:na]
    at org.iypt.planner.gui.PlannerWindow$SolverTask.execute(PlannerWindow.java:532) ~[classes/:na]
    at org.apache.pivot.util.concurrent.Task$ExecuteCallback.run(Task.java:42) ~[pivot-core-2.0.2.jar:2.0.2]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_09-icedtea]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) ~[na:1.7.0_09-icedtea]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) ~[na:1.7.0_09-icedtea]
    at java.lang.Thread.run(Thread.java:722) ~[na:1.7.0_09-icedtea]

Solution diff

Will be useful after replacing absent jurors. There must be a way to compare the proposed alternative to the original schedule, or at least it should be possible to review the list of changes.

java.util.ConcurrentModificationException

java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1067)
at org.iypt.planner.gui.PlannerWindow.solutionChanged(PlannerWindow.java:434)
at org.iypt.planner.gui.PlannerWindow$SolverListener$1.run(PlannerWindow.java:523)
at org.apache.pivot.wtk.ApplicationContext$QueuedCallback.run(ApplicationContext.java:1557)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Include timestamp and version in reports

Export-PDFs: add timestamp (versioning)
a timestamp both in the file and in its filename would be helpful, as we keep updating the pages and want to make sure not to distribute out of date information.

Improve file browsing

  • set root folder to the last selected file's parent
  • persist the root folder using java.util.Preferences
  • make .csv file filtering possible to be disabled (for the case when a file to be loaded doesn't have .csv suffix)

Arbitrary level locking

It is often the case that we want to optimize very locally because the schedules are already distributed, but then a juror does not show up. If not only rounds but individual rooms or even each juror could be fixed this would help a lot in these cases.

Improve CO summary

  • Add sort options
    • by count
    • by total score
    • by ConstraintComparator
  • expand/collapse all

Show last improvement timestamp

May be useful for long running planning. Try to make up a more sophisticated statistic. Of course, score graph would be ideal.

UI managed loading of biases

Add menu items for loading the full data file to compute biases from and for storing/loading computed biases.

Setup planner benchmarks

Subtasks:

  • make sure planner doesn't get stuck in local optima
  • make sure there are no score traps (e.g. in windowed planning -- change penalties may prevent any moves at all)

Log user actions

Especially manual changes.

This can have several purposes:

  • textual confirmation of the last performed changed
  • history of all changes
  • cheap replacement for undo/redo feature

MVEL compiler bug on Windows with Java 8

System configuration: Windows 8, 64bit, 8GB RAM, Java version 8u45.

Console output:

00:39:55.590 [Thread-38] INFO  o.d.p.c.l.DefaultLocalSearchSolverPhase - Phase localSearch ended: step total (12), time spend (1610), best score (-1hard/-3634soft).
00:39:55.590 [Thread-38] INFO  o.d.p.core.solver.DefaultSolver - Solving ended:time spend (1610), best score (-1hard/-3634soft), average calculate count per second (1705).
00:39:59.755 [Thread-39] INFO  o.d.p.core.solver.DefaultSolver - Solving started: time spend (10), score (null), new best score (null), random seed (not fixed).
00:40:01.809 [Thread-39] INFO  o.d.p.c.c.g.DefaultGreedyFitSolverPhase - Phase constructionHeuristic ended: step total (270), time spend (2064), best score (-2hard/-4377soft).
00:40:03.772 [AWT-EventQueue-0] INFO  o.d.p.c.s.BasicPlumbingTermination - Terminating solver early.
00:40:03.798 [Thread-39] INFO  o.d.p.c.l.DefaultLocalSearchSolverPhase - Phase localSearch ended: step total (22), time spend (4053), best score (-1hard/-3456soft).
00:40:03.798 [Thread-39] INFO  o.d.p.core.solver.DefaultSolver - Solving ended:time spend (4053), best score (-1hard/-3456soft), average calculate count per second (5850).
**** COMPILER BUG! REPORT THIS IMMEDIATELY AT http://jira.codehaus.org/browse/mvel2
Expression: @declare{"returnValueMethod"}
public static org.drools.spi.FieldValue @{methodName}(@foreach{declr : declarations} @{declr.typeName} @{declr.identifier} @end{","} @if{localDeclarations != empty && declarations != empty},@end{}
                                                      @foreach{declr : localDeclarations} @{declr.typeName} @{declr.identifier} @end{","} @if{globals != empty && (localDeclarations != empty || declarations != empty)},@end{}
                                                      @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} @end{","} ) throws Exception {
    return org.drools.base.FieldFactory.getInstance().getFieldValue( @{text} );
}
@end{}

@declare{"predicateMethod"}
public static boolean @{methodName}(@foreach{declr : declarations} @{declr.typeName} @{declr.identifier} @end{","} @if{localDeclarations != empty && declarations != empty},@end{}
                                                      @foreach{declr : localDeclarations } @{declr.typeName} @{declr.identifier} @end{","} @if{globals != empty&& (localDeclarations != empty || declarations != empty)},@end{}
                                                      @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} @end{","} ) throws Exception {
    return ( @{text} );
}
@end{}

@declare{"evalMethod"}
public static boolean @{methodName}(@foreach{declr : declarations} @{declr.typeName} @{declr.identifier} @end{","} @if{globals != empty && declarations != empty},@end{}
                                    @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} @end{","} ) throws Exception {
    return ( @{text} );
}
@end{}

@declare{"accumulateInnerClass"}
public static class @{className} implements java.io.Serializable {

    private static final long    serialVersionUID = 510l;

    @if{supportsReverse == "true"}
    private java.util.Map reverseMap = new java.util.HashMap<Integer, ReverseSnapshot>();
    @end{}

    @foreach{type : attributesTypes, attr : attributes} private @{type} @{attr};

    @end{}

    public @{className}() {
    }

    public void init(@foreach{declr : declarations} @{declr.typeName} @{declr.identifier}@end{","}@if{globals != empty && declarations != empty},@end{}
                     @foreach{type : globalTypes, identifier : globals} @{type}@{identifier} @end{","}
                     ) throws Exception {
        @{initCode}
    }

    public void accumulate(org.drools.WorkingMemory workingMemory,
                           org.drools.common.InternalFactHandle handle,
                           org.drools.rule.Declaration[] innerDeclarations,
                           Object object @if{declarations != empty}, @end{}
                           @foreach{declr : declarations} @{declr.typeName} @{declr.identifier}@end{","}@if{globals != empty},@end{}
                           @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} @end{","}@if{innerDeclarations != empty},@end{}
                           @foreach{declr : innerDeclarations}@{declr.extractor.extractToClassName} @{declr.identifier}@end{","}
                           ) throws Exception {
        @if{supportsReverse == "true"}
        this.reverseMap.put( Integer.valueOf( handle.getId() ),
                             new ReverseSnapshot(
                               @foreach{declr : declarations}@{declr.identifier}@end{","}@if{innerDeclarations != empty && declarations != empty},@end{}
                               @foreach{declr : innerDeclarations}@{declr.identifier}@end{","}
                              ) );
        @end{}
        @{actionCode}
    }

    public void reverse(org.drools.WorkingMemory workingMemory,
                           org.drools.common.InternalFactHandle handle,
                           Object object@if{globals != empty},@end{}
                           @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} @end{","}
                           ) throws Exception {
        @if{supportsReverse == "true"}
        ReverseSnapshot snapshot = (ReverseSnapshot) this.reverseMap.remove( Integer.valueOf( handle.getId() ) );
        @foreach{declr : declarations}@{declr.typeName} @{declr.identifier} = snapshot.@{declr.identifier};@end{}
        @foreach{declr : innerDeclarations}@{declr.extractor.extractToClassName} @{declr.identifier} = snapshot.@{declr.identifier};@end{}
        @end{}
        @{reverseCode}
    }

    public Object getResult(@foreach{declr : declarations} @{declr.typeName} @{declr.identifier}@end{","}@if{globals != empty && declarations != empty},@end{}
                            @foreach{type : globalTypes, identifier : globals}@{type} @{identifier} @end{","}
                           ) throws Exception {
        return ( @{resultCode} );
    }

    public boolean supportsReverse() {
        return @{supportsReverse};
    }

    @if{supportsReverse == "true"}
    private static class ReverseSnapshot implements java.io.Serializable {
        @foreach{declr : declarations} public final @{declr.typeName} @{declr.identifier};@end{}
        @foreach{declr : innerDeclarations}public final @{declr.extractor.extractToClassName} @{declr.identifier};@end{}

        public ReverseSnapshot(@foreach{declr : declarations}final @{declr.typeName} @{declr.identifier}@end{","}@if{innerDeclarations != empty && declarations!= empty},@end{}
                               @foreach{declr : innerDeclarations}final @{declr.extractor.extractToClassName} @{declr.identifier}@end{","}
                              ) {
            @foreach{declr : declarations}this.@{declr.identifier} = @{declr.identifier};@end{}
            @foreach{declr : innerDeclarations}this.@{declr.identifier} = @{declr.identifier};@end{}
        }
    }
    @end{}
}
@end{}

@declare{"consequenceMethod"}
public static void @{methodName}(org.drools.spi.KnowledgeHelper drools@if{declarations != empty},@end{} @foreach{declr : declarations} @{declr.typeName} @{declr.identifier}, org.drools.FactHandle @{declr.identifier}__Handle__ @end{","}@if{globals != empty},@end{} @foreach{type : globalTypes, identifier : globals}  @{type} @{identifier} @end{","} ) throws Exception { org.drools.runtime.rule.RuleContext kcontext = drools;
    @{text}
}@end{}

@declare{"actionMethod"}
public static void @{methodName}(org.drools.spi.KnowledgeHelper drools@if{globals != empty},@end{} @foreach{type :globalTypes, identifier : globals}  @{type} @{identifier} @end{","} @if{variables != empty},@end{} @foreach{type2 :variableTypes, identifier2 : variables}  @{type2} @{identifier2} @end{","}, org.drools.spi.ProcessContext context ) throws Exception {
    org.drools.runtime.process.ProcessContext kcontext = context;
    @{text}
}
@end{}

@declare{"returnValueEvaluatorMethod"}
public static Object @{methodName}(org.drools.spi.ProcessContext context@if{globals != empty},@end{} @foreach{type : globalTypes, identifier : globals}  @{type} @{identifier} @end{","} @if{variables != empty},@end{} @foreach{type2 :variableTypes, identifier2 : variables}  @{type2} @{identifier2} @end{","} ) throws Exception {
    org.drools.runtime.process.ProcessContext kcontext = context;
    @{text}
}
@end{}

00:40:04.645 [AWT-EventQueue-0] ERROR org.iypt.planner.gui.PlannerWindow - Error during solution
java.lang.VerifyError: (class: ASMAccessorImpl_2761208651435254004620, method: getKnownEgressType signature: ()Ljava/lang/Class;) Illegal type in constant pool
        at java.lang.Class.getDeclaredConstructors0(Native Method) ~[na:1.8.0_45]
        at java.lang.Class.privateGetDeclaredConstructors(Unknown Source) ~[na:1.8.0_45]
        at java.lang.Class.getConstructor0(Unknown Source) ~[na:1.8.0_45]
        at java.lang.Class.newInstance(Unknown Source) ~[na:1.8.0_45]
        at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer._initializeAccessor(ASMAccessorOptimizer.java:725) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:859) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.optimizeAccessor(ASMAccessorOptimizer.java:243) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.optimizers.dynamic.DynamicGetAccessor.optimize(DynamicGetAccessor.java:90) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:64) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.MVEL.executeExpression(MVEL.java:930) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:45) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.TextNode.eval(TextNode.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.CompiledForEachNode.eval(CompiledForEachNode.java:114) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.TextNode.eval(TextNode.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.TerminalNode.eval(TerminalNode.java:35) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.TextNode.eval(TextNode.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.CompiledIfNode.eval(CompiledIfNode.java:44) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.TextNode.eval(TextNode.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.CompiledExpressionNode.eval(CompiledExpressionNode.java:46) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.res.TextNode.eval(TextNode.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:285) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:247) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:255) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.mvel2.templates.TemplateRuntime.execute(TemplateRuntime.java:207) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.rule.builder.dialect.java.JavaRuleBuilderHelper.generateMethodTemplate(JavaRuleBuilderHelper.java:215) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.rule.builder.dialect.asm.AbstractASMConsequenceBuilder.build(AbstractASMConsequenceBuilder.java:26) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:103) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:2830)~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.compiler.PackageBuilder.compileRules(PackageBuilder.java:970) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.compiler.PackageBuilder.compileAllRules(PackageBuilder.java:879) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:871) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:440) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:418) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.planner.config.score.director.ScoreDirectorFactoryConfig.buildRuleBase(ScoreDirectorFactoryConfig.java:245) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.planner.config.score.director.ScoreDirectorFactoryConfig.buildDroolsScoreDirectorFactory(ScoreDirectorFactoryConfig.java:225) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.planner.config.score.director.ScoreDirectorFactoryConfig.buildScoreDirectorFactory(ScoreDirectorFactoryConfig.java:157) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.planner.config.solver.SolverConfig.buildSolver(SolverConfig.java:142) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.drools.planner.config.XmlSolverFactory.buildSolver(XmlSolverFactory.java:104) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.iypt.planner.solver.TournamentSolver.solve(TournamentSolver.java:144) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.iypt.planner.gui.PlannerWindow$SolverTask.execute(PlannerWindow.java:578) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.iypt.planner.gui.PlannerWindow$SolverTask.execute(PlannerWindow.java:564) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at org.apache.pivot.util.concurrent.Task$ExecuteCallback.run(Task.java:42) ~[iypt-planner-0.2-SNAPSHOT-jar-with-dependencies_korrigiert.jar:na]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:1.8.0_45]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.8.0_45]
        at java.lang.Thread.run(Unknown Source) ~[na:1.8.0_45]

Jury planner version https://github.com/yurloc/iypt-planner/releases/tag/v0.2.0-alpha2, built with javac 1.7.0_79, MVEL 2.1.3.Final

Printable output

  • complete schedule on single A4 sheet
  • each round on a sheet
  • each group per round on a sheet - posters for fight rooms
  • HTML/PDF

Upgrade to Java 8

On the source level to allow functional programming features, on the build level it may fix #36.

Interactive causes

Clicking a CO cause should highlight/activate it's UI element in the schedule (if present).

Include idle jurors in round report

Export-PDFs: additional page(s) in order to list jurors not scheduled would help both the jurors - to quickly check whether they are free - and us to find replacements.

Chair balance

We have manually switched many chairs, because e.g. John B. was often the second person who is able to chair in a jury, but was never selected as chair, even though the other one was supposed to chair 5 out of 5 fights. As chairing is even tougher than judging, this should be avoided.

Biases

Provide possibility to load biases of jurors, or, better, to load full data of a previous tournament and calculate biases.

Jurors can have zero conflicts

We might have jurors who don't feel any bias - we now just give them a conflict with a nation that does not participate.

Inexperienced jurors distribution

There is a requirement for jurors who have never voted before to act as non-voting members to gain their first experience. Only after that they will be assigned as regular jurors.

From the scheduling point of view this means that inexperienced jurors have -1 rounds available for being voting jury members. To avoid having this negative impact on overall jury capacity it has been proposed to allow for a variable jury capacity: typically N-1 in the first round, where the majority of inexperienced jurors are supposed to gain experience, and N in all subsequent rounds.

This requires:

  • rule that prevents assigning an inexperienced juror in the first round he or she is available
  • variable jury sizes per round
  • distributing non-voting jurors to juries + UI representation
  • including non-voting jurors in PDF reports
  • storing jurors on non-voting positions in schedule CSV and recognizing them during import

Search juror by name

There should be a quick and easy way to get details about certain juror without having to find him in the schedule first. Text input with suggestion popup would be great.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.