Skip to content

Commit

Permalink
Inclusion of BidiMap to query relation between SchedulingActivityDire…
Browse files Browse the repository at this point in the history
…ctiveIds and ActivityDirectiveIds
  • Loading branch information
jmdelfa authored and dandelany committed Jun 7, 2024
1 parent 724e93b commit 485846a
Show file tree
Hide file tree
Showing 11 changed files with 118 additions and 41 deletions.
2 changes: 1 addition & 1 deletion scheduler-driver/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ dependencies {
implementation 'com.google.guava:guava:32.1.2-jre'
implementation 'org.jgrapht:jgrapht-core:1.5.2'
implementation 'org.slf4j:slf4j-simple:2.0.7'

implementation 'org.apache.commons:commons-collections4:4.4'
testImplementation project(':merlin-framework-junit')
testImplementation project(':constraints')
testImplementation project(':examples:banananation')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@
import gov.nasa.jpl.aerie.constraints.model.SimulationResults;
import gov.nasa.jpl.aerie.constraints.time.Interval;
import gov.nasa.jpl.aerie.constraints.time.Windows;
import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel;
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
import gov.nasa.jpl.aerie.scheduler.Range;
import gov.nasa.jpl.aerie.scheduler.conflicts.Conflict;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingActivityTemplateConflict;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingAssociationConflict;
import gov.nasa.jpl.aerie.scheduler.conflicts.UnsatisfiableGoalConflict;
import gov.nasa.jpl.aerie.scheduler.constraints.activities.ActivityExpression;
import gov.nasa.jpl.aerie.scheduler.model.Plan;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirective;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirectiveId;
import org.apache.commons.collections4.BidiMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirective;
import gov.nasa.jpl.aerie.scheduler.conflicts.Conflict;
import gov.nasa.jpl.aerie.scheduler.model.Plan;
import gov.nasa.jpl.aerie.scheduler.Range;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingActivityTemplateConflict;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingAssociationConflict;

import java.util.Collection;
import java.util.Comparator;
Expand Down Expand Up @@ -127,6 +129,7 @@ protected CardinalityGoal fill(CardinalityGoal goal) {
public Collection<Conflict> getConflicts(
final Plan plan,
final SimulationResults simulationResults,
final Optional<BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId>> mapSchedulingIdsToActivityIds,
final EvaluationEnvironment evaluationEnvironment,
final SchedulerModel schedulerModel) {

Expand Down Expand Up @@ -200,7 +203,7 @@ else if (this.initiallyEvaluatedTemporalContext == null) {
for (final var act : acts) {
if (!associatedActivitiesToThisGoal.contains(act) && planEvaluation.canAssociateMoreToCreatorOf(act)) {
//they ALL have to be associated
conflicts.add(new MissingAssociationConflict(this, List.of(act)));
conflicts.add(new MissingAssociationConflict(this, List.of(act), Optional.empty(), Optional.empty()));
}
}

Expand All @@ -211,6 +214,8 @@ else if (this.initiallyEvaluatedTemporalContext == null) {
this.desiredActTemplate,
evaluationEnvironment,
nbToSchedule,
Optional.empty(),
Optional.empty(),
durToSchedule.isPositive() ? Optional.of(durToSchedule) : Optional.empty()));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,18 @@
import gov.nasa.jpl.aerie.constraints.tree.And;
import gov.nasa.jpl.aerie.constraints.tree.Expression;
import gov.nasa.jpl.aerie.constraints.tree.WindowsWrapperExpression;
import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel;
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
import gov.nasa.jpl.aerie.scheduler.conflicts.Conflict;
import gov.nasa.jpl.aerie.scheduler.model.Plan;
import gov.nasa.jpl.aerie.scheduler.model.PlanningHorizon;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirectiveId;
import org.apache.commons.collections4.BidiMap;

import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

/**
* describes some criteria that is desired in the solution plans
Expand Down Expand Up @@ -288,6 +292,7 @@ public String getName() {
public java.util.Collection<Conflict> getConflicts(
Plan plan,
final SimulationResults simulationResults,
final Optional<BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId>> mapSchedulingIdsToActivityIds,
final EvaluationEnvironment evaluationEnvironment,
final SchedulerModel schedulerModel
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

import gov.nasa.jpl.aerie.constraints.model.EvaluationEnvironment;
import gov.nasa.jpl.aerie.constraints.model.SimulationResults;
import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel;
import gov.nasa.jpl.aerie.scheduler.conflicts.Conflict;
import gov.nasa.jpl.aerie.scheduler.model.Plan;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirectiveId;
import gov.nasa.jpl.aerie.scheduler.solver.optimizers.Optimizer;
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.lang3.NotImplementedException;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class OptionGoal extends Goal {

Expand All @@ -33,6 +37,7 @@ public Optimizer getOptimizer(){
public java.util.Collection<Conflict> getConflicts(
final Plan plan,
final SimulationResults simulationResults,
final Optional<BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId>> mapSchedulingIdsToActivityIds,
final EvaluationEnvironment evaluationEnvironment,
final SchedulerModel schedulerModel) {
throw new NotImplementedException("Conflict detection is performed at solver level");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,19 @@
import gov.nasa.jpl.aerie.constraints.model.SimulationResults;
import gov.nasa.jpl.aerie.constraints.time.Interval;
import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel;
import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.scheduler.constraints.activities.ActivityExpression;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirective;
import gov.nasa.jpl.aerie.scheduler.conflicts.Conflict;
import gov.nasa.jpl.aerie.scheduler.model.Plan;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingActivityInstanceConflict;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingAssociationConflict;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirectiveId;
import org.apache.commons.collections4.BidiMap;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;
import java.util.function.Function;

/**
Expand Down Expand Up @@ -113,6 +117,7 @@ protected ProceduralCreationGoal fill(ProceduralCreationGoal goal) {
public Collection<Conflict> getConflicts(
final Plan plan,
final SimulationResults simulationResults,
final Optional<BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId>> mapSchedulingIdsToActivityIds,
final EvaluationEnvironment evaluationEnvironment,
final SchedulerModel schedulerModel) {
final var conflicts = new java.util.LinkedList<Conflict>();
Expand Down Expand Up @@ -160,7 +165,11 @@ public Collection<Conflict> getConflicts(
//REVIEW: pass the requested instance to conflict or otherwise cache it
// for the imminent request to create it in the plan
} else {
conflicts.add(new MissingAssociationConflict(this, missingActAssociations));
conflicts.add(new MissingAssociationConflict(
this,
missingActAssociations,
Optional.empty(),
Optional.empty()));
}
}
}//for(requestedAct)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import gov.nasa.jpl.aerie.constraints.model.SimulationResults;
import gov.nasa.jpl.aerie.constraints.time.Interval;
import gov.nasa.jpl.aerie.constraints.time.Windows;
import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel;
import gov.nasa.jpl.aerie.merlin.protocol.types.Duration;
import gov.nasa.jpl.aerie.merlin.protocol.types.DurationType;
Expand All @@ -14,6 +15,8 @@
import gov.nasa.jpl.aerie.scheduler.model.Plan;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingActivityTemplateConflict;
import gov.nasa.jpl.aerie.scheduler.conflicts.MissingAssociationConflict;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirectiveId;
import org.apache.commons.collections4.BidiMap;
import org.jetbrains.annotations.NotNull;

import java.util.List;
Expand Down Expand Up @@ -113,6 +116,7 @@ else if (every.max.isNegative()) {
public java.util.Collection<Conflict> getConflicts(
@NotNull final Plan plan,
final SimulationResults simulationResults,
final Optional<BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId>> mapSchedulingIdsToActivityIds,
final EvaluationEnvironment evaluationEnvironment,
final SchedulerModel schedulerModel) {
final var conflicts = new java.util.LinkedList<Conflict>();
Expand Down Expand Up @@ -171,7 +175,7 @@ else if (this.initiallyEvaluatedTemporalContext == null) {
var planEval = plan.getEvaluation();
if (!planEval.forGoal(this).getAssociatedActivities().contains(act) && planEval.canAssociateMoreToCreatorOf(
act)) {
conflicts.add(new MissingAssociationConflict(this, List.of(act)));
conflicts.add(new MissingAssociationConflict(this, List.of(act), Optional.empty(), Optional.empty()));
}
}

Expand Down Expand Up @@ -222,7 +226,7 @@ private java.util.Collection<MissingActivityConflict> makeRecurrenceConflicts(Du
) {
final var windows = new Windows(false).set(Interval.betweenClosedOpen(intervalT.minus(recurrenceInterval.max), Duration.min(intervalT, end)), true);
if(windows.iterateEqualTo(true).iterator().hasNext()){
conflicts.add(new MissingActivityTemplateConflict(this, windows, this.getActTemplate(), evaluationEnvironment, 1, Optional.empty()));
conflicts.add(new MissingActivityTemplateConflict(this, windows, this.getActTemplate(), evaluationEnvironment, 1,Optional.empty(), Optional.empty(), Optional.empty()));
}
if(intervalT.compareTo(end) >= 0){
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import gov.nasa.jpl.aerie.constraints.model.DiscreteProfile;
import gov.nasa.jpl.aerie.constraints.model.LinearProfile;
import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.merlin.driver.MissionModel;
import gov.nasa.jpl.aerie.merlin.driver.SimulationResults;
import gov.nasa.jpl.aerie.merlin.protocol.model.SchedulerModel;
Expand All @@ -10,6 +11,7 @@
import gov.nasa.jpl.aerie.scheduler.simulation.SimulationData;
import gov.nasa.jpl.aerie.scheduler.simulation.SimulationFacade;
import gov.nasa.jpl.aerie.scheduler.simulation.SimulationResultsConverter;
import org.apache.commons.collections4.BidiMap;

import java.util.ArrayList;
import java.util.Collection;
Expand Down Expand Up @@ -138,12 +140,12 @@ public Plan getInitialPlan() {
* @param initialSimulationResults optional initial simulation results associated to the initial plan
* @param plan the initial seed plan that schedulers may start from
*/
public void setInitialPlan(final Plan plan, final Optional<SimulationResults> initialSimulationResults) {
public void setInitialPlan(final Plan plan, final Optional<SimulationResults> initialSimulationResults, final BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId> mapSchedulingIdsToActivityIds) {
initialPlan = plan;
this.initialSimulationResults = initialSimulationResults.map(simulationResults -> new SimulationData(
simulationResults,
SimulationResultsConverter.convertToConstraintModelResults(
simulationResults)));
simulationResults), Optional.ofNullable(mapSchedulingIdsToActivityIds)));
}

/**
Expand All @@ -152,7 +154,7 @@ public void setInitialPlan(final Plan plan, final Optional<SimulationResults> in
* @param plan the initial seed plan that schedulers may start from
*/
public void setInitialPlan(final Plan plan) {
setInitialPlan(plan, Optional.empty());
setInitialPlan(plan, Optional.empty(), null);
}

public Optional<SimulationData> getInitialSimulationResults(){ return initialSimulationResults; }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package gov.nasa.jpl.aerie.scheduler.simulation;

import gov.nasa.jpl.aerie.merlin.driver.ActivityDirectiveId;
import gov.nasa.jpl.aerie.merlin.driver.SimulationResults;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirective;
import gov.nasa.jpl.aerie.scheduler.model.SchedulingActivityDirectiveId;
import org.apache.commons.collections4.BidiMap;

import java.util.Collection;
import java.util.Optional;

public record SimulationData(
SimulationResults driverResults,
gov.nasa.jpl.aerie.constraints.model.SimulationResults constraintsResults
gov.nasa.jpl.aerie.constraints.model.SimulationResults constraintsResults,
Optional<BidiMap<SchedulingActivityDirectiveId, ActivityDirectiveId>> mapSchedulingIdsToActivityIds
){}
Loading

0 comments on commit 485846a

Please sign in to comment.