Search in sources :

Example 56 with TaskAssigningSolution

use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.

the class TaskAssigningResourceTest method getSolution.

@Test
void getSolution() {
    TaskAssigningSolution solution = new TaskAssigningSolution();
    doReturn(solution).when(service).getCurrentSolution();
    assertThat(resource.getSolution()).isSameAs(solution);
}
Also used : TaskAssigningSolution(org.kie.kogito.taskassigning.core.model.TaskAssigningSolution) Test(org.junit.jupiter.api.Test)

Example 57 with TaskAssigningSolution

use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.

the class PlanningBuilderTest method build.

@Test
void build() {
    context = new TaskAssigningServiceContext();
    List<TaskAssignment> user1Assignments = Arrays.asList(mockTaskAssignment(USER1_TASK1), mockTaskAssignment(DUMMY_TASK_ASSIGNMENT.getId()), mockTaskAssignment(USER1_TASK2), mockTaskAssignment(USER1_TASK3));
    User user1 = mockUser(USER1, user1Assignments);
    List<TaskAssignment> user2Assignments = Arrays.asList(mockTaskAssignment(USER2_TASK1), mockTaskAssignment(USER2_TASK2));
    User user2 = mockUser(USER2, user2Assignments);
    List<TaskAssignment> user3Assignments = Arrays.asList(mockTaskAssignment(USER3_TASK1), mockTaskAssignment(USER3_TASK2), mockTaskAssignment(USER3_TASK3), mockTaskAssignment(USER3_TASK4));
    User user3 = mockUser(USER3, user3Assignments);
    List<TaskAssignment> planningUserAssignments = Arrays.asList(mockTaskAssignment(PLANNING_USER_TASK1), mockTaskAssignment(PLANNING_USER_TASK2), mockTaskAssignment(PLANNING_USER_TASK3), mockTaskAssignment(PLANNING_USER_TASK4), mockTaskAssignment(PLANNING_USER_TASK5));
    User planningUser = mockUser(PLANNING_USER_ID, planningUserAssignments);
    List<TaskAssignment> allAssignments = new ArrayList<>(user1Assignments);
    allAssignments.addAll(user2Assignments);
    allAssignments.addAll(user3Assignments);
    allAssignments.addAll(planningUserAssignments);
    List<User> allUsers = Arrays.asList(user1, user2, user3, planningUser);
    TaskAssigningSolution solution = new TaskAssigningSolution("1", allUsers, allAssignments);
    context.setTaskPublished(USER1_TASK1, false);
    context.setTaskPublished(DUMMY_TASK_ASSIGNMENT.getId(), false);
    context.setTaskPublished(USER1_TASK2, false);
    context.setTaskPublished(USER1_TASK3, false);
    context.setTaskPublished(USER2_TASK1, true);
    context.setTaskPublished(USER2_TASK2, true);
    context.setTaskPublished(USER3_TASK1, false);
    context.setTaskPublished(USER3_TASK2, true);
    context.setTaskPublished(USER3_TASK3, true);
    context.setTaskPublished(USER3_TASK4, false);
    context.setTaskPublished(PLANNING_USER_TASK1, true);
    context.setTaskPublished(PLANNING_USER_TASK2, false);
    context.setTaskPublished(PLANNING_USER_TASK3, false);
    context.setTaskPublished(PLANNING_USER_TASK4, false);
    context.setTaskPublished(PLANNING_USER_TASK5, false);
    List<PlanningItem> planningItems = PlanningBuilder.create().withContext(context).withPublishWindowSize(2).forSolution(solution).build();
    List<TaskAssignment> expectedAssignmentsInPlanning = new ArrayList<>();
    expectedAssignmentsInPlanning.add(user1Assignments.get(0));
    expectedAssignmentsInPlanning.add(user1Assignments.get(2));
    expectedAssignmentsInPlanning.add(user3Assignments.get(0));
    expectedAssignmentsInPlanning.add(planningUserAssignments.get(1));
    expectedAssignmentsInPlanning.add(planningUserAssignments.get(2));
    expectedAssignmentsInPlanning.add(planningUserAssignments.get(3));
    expectedAssignmentsInPlanning.add(planningUserAssignments.get(4));
    assertItemsForAssignments(planningItems, expectedAssignmentsInPlanning);
}
Also used : TestUtil.mockUser(org.kie.kogito.taskassigning.service.TestUtil.mockUser) User(org.kie.kogito.taskassigning.core.model.User) ArrayList(java.util.ArrayList) TaskAssigningSolution(org.kie.kogito.taskassigning.core.model.TaskAssigningSolution) TaskAssignment(org.kie.kogito.taskassigning.core.model.TaskAssignment) TestUtil.mockTaskAssignment(org.kie.kogito.taskassigning.service.TestUtil.mockTaskAssignment) Test(org.junit.jupiter.api.Test)

Example 58 with TaskAssigningSolution

use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.

the class AddUserProblemFactChangeTest method setUp.

@BeforeEach
void setUp() {
    user = new User(USER_ID);
    workingSolution = new TaskAssigningSolution("1", new ArrayList<>(), new ArrayList<>());
    change = new AddUserProblemFactChange(user);
}
Also used : User(org.kie.kogito.taskassigning.core.model.User) TaskAssigningSolution(org.kie.kogito.taskassigning.core.model.TaskAssigningSolution) ArrayList(java.util.ArrayList) BeforeEach(org.junit.jupiter.api.BeforeEach)

Example 59 with TaskAssigningSolution

use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.

the class AssignTaskProblemFactChangeTest method setUp.

@BeforeEach
void setUp() {
    solution = new TaskAssigningSolution("1", new ArrayList<>(), new ArrayList<>());
    lenient().when(scoreDirector.getWorkingSolution()).thenReturn(solution);
}
Also used : TaskAssigningSolution(org.kie.kogito.taskassigning.core.model.TaskAssigningSolution) ArrayList(java.util.ArrayList) BeforeEach(org.junit.jupiter.api.BeforeEach)

Example 60 with TaskAssigningSolution

use of org.kie.kogito.taskassigning.core.model.TaskAssigningSolution in project kogito-apps by kiegroup.

the class AbstractExecutableProblemFactChangeTest method executeSequentialChanges.

protected TaskAssigningSolution executeSequentialChanges(TaskAssigningSolution solution, List<? extends ProgrammedProblemFactChange> changes) {
    Solver<TaskAssigningSolution> solver = createDaemonSolver();
    // store the first solution that was produced by the solver for knowing how things looked like at the very
    // beginning before any change was produced.
    final TaskAssigningSolution[] initialSolution = { null };
    final AtomicInteger lastExecutedChangeId = new AtomicInteger(-1);
    final Semaphore programNextChange = new Semaphore(0);
    final Semaphore allChangesWereProduced = new Semaphore(0);
    // prepare the list of changes to program
    List<ProgrammedProblemFactChange> programmedChanges = new ArrayList<>(changes);
    List<ProgrammedProblemFactChange> scheduledChanges = new ArrayList<>();
    int totalProgrammedChanges = programmedChanges.size();
    int[] pendingChanges = { programmedChanges.size() };
    solver.addEventListener(event -> {
        if (initialSolution[0] == null) {
            // store the first produced solution for knowing how things looked like at the very beginning.
            initialSolution[0] = event.getNewBestSolution();
            // let the problem fact changes start being produced.
            programNextChange.release();
        } else if (event.isEveryProblemFactChangeProcessed() && !scheduledChanges.isEmpty()) {
            ProgrammedProblemFactChange programmedChange = scheduledChanges.get(scheduledChanges.size() - 1);
            if (lastExecutedChangeId.compareAndSet(programmedChange.getId(), -1)) {
                programmedChange.setSolutionAfterChange(event.getNewBestSolution());
                if (pendingChanges[0] > 0) {
                    // let the Programmed changes producer produce next change
                    programNextChange.release();
                } else {
                    solver.terminateEarly();
                    allChangesWereProduced.release();
                }
            }
        }
    });
    // Programmed changes producer Thread.
    CompletableFuture.runAsync(() -> {
        boolean hasMoreChanges = true;
        while (hasMoreChanges) {
            try {
                // wait until next problem fact change can be added to the solver.
                // by construction the lock is only released when no problem fact change is in progress.
                programNextChange.acquire();
                ProgrammedProblemFactChange programmedChange = programmedChanges.remove(0);
                hasMoreChanges = !programmedChanges.isEmpty();
                pendingChanges[0] = programmedChanges.size();
                scheduledChanges.add(programmedChange);
                solver.addProblemFactChange(scoreDirector -> {
                    lastExecutedChangeId.set(programmedChange.getId());
                    programmedChange.getChange().doChange(scoreDirector);
                });
            } catch (InterruptedException e) {
                LOGGER.error("It looks like the test Future was interrupted.", e);
            }
        }
        try {
            // wait until the solver listener has processed all the changes.
            allChangesWereProduced.acquire();
        } catch (InterruptedException e) {
            LOGGER.error("It looks like the test Future was interrupted while waiting to finish.", e);
        }
    });
    solver.solve(solution);
    assertThat(programmedChanges.isEmpty()).isTrue();
    assertThat(scheduledChanges.size()).isEqualTo(totalProgrammedChanges);
    assertThat(pendingChanges[0]).isZero();
    return initialSolution[0];
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) TaskAssigningSolution(org.kie.kogito.taskassigning.core.model.TaskAssigningSolution) ArrayList(java.util.ArrayList) Semaphore(java.util.concurrent.Semaphore)

Aggregations

TaskAssigningSolution (org.kie.kogito.taskassigning.core.model.TaskAssigningSolution)65 Test (org.junit.jupiter.api.Test)30 User (org.kie.kogito.taskassigning.core.model.User)24 TaskAssignment (org.kie.kogito.taskassigning.core.model.TaskAssignment)23 ArrayList (java.util.ArrayList)15 AssignTaskProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.AssignTaskProblemFactChange)12 TaskUtil.fromTaskData (org.kie.kogito.taskassigning.service.util.TaskUtil.fromTaskData)12 AddTaskProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.AddTaskProblemFactChange)11 TestUtil.mockTaskData (org.kie.kogito.taskassigning.service.TestUtil.mockTaskData)11 ProblemFactChange (org.optaplanner.core.api.solver.ProblemFactChange)11 RemoveTaskProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.RemoveTaskProblemFactChange)10 AddUserProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.AddUserProblemFactChange)9 DisableUserProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.DisableUserProblemFactChange)7 ReleaseTaskProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.ReleaseTaskProblemFactChange)7 RemoveUserProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.RemoveUserProblemFactChange)7 UserPropertyChangeProblemFactChange (org.kie.kogito.taskassigning.core.model.solver.realtime.UserPropertyChangeProblemFactChange)7 List (java.util.List)5 BeforeEach (org.junit.jupiter.api.BeforeEach)5 Task (org.kie.kogito.taskassigning.core.model.Task)5 UserDataEvent (org.kie.kogito.taskassigning.service.event.UserDataEvent)5