Overview

Before 0.3.0

The following are planned as part of the 0.3.0 release.

Script incremental builds (done)
Script attribute reporting (done)
Documentation rewrite (done)
Goal scheduling (done)
Attribute average values (done)
Node filtering for average values (done)
Attribute support modulus operator
Script attribute grid for averages
Script incremental build supports configuration overwrite (maybe)

Features

Goals

Scheduling goals are available starting with 0.2.4. Goals can specifycycles=N, attribute=>{name=>{op=>'max|min'},name=>{op=>'eq|ne',value=>x}}. Rescheduling will repeat through cycles and the schedule with the highest score will be returned. Only attribute-based, average value goals seeking is planned at this time.

Documentation

Rewrite in progress starting with 0.2.3. The documentation in Schedule::Activity is very thorough and complete, though some historical information is outdated. Introductory and overview documentation is somewhat lacking. That and better organization is the goal of the rewrite, as well as consistent terminology.

Attributes

Attribute recomputation is supported starting with 0.2.2, primarily for merged annotation support.

Attribute average values are available for goals starting with 0.2.5, which also cleaned up behavioral questions about initial average values, and averages during time overlaps. See "Consistency" in Schedule::Activity.

Rudimentary attribute reporting from the commandline is supported starting with 0.2.2.

Node filtering

Average value filtering is available starting with 0.2.5. The most recent value is always used as the "current value" for the attribute, and the rolling average is updated to the "random current time" when evaluating any NodeFilter. This permits node activation based on "eventual activation" without explicit checkpointing/materialization of attributes. The user may still fix the attribute to affect the averages with more granularity as desired.

Annotations

Annotation filtering. Some annotations may occur before an action but not when after certain other actions. Annotations should support node filtering for this situation. No timeline has been established.

Annotations may also benefit from a schedule-wide closeness configuration, but no timeline has been established.

Scheduling

Incremental scheduling is available in the module and from the commandline starting with 0.2.1. Attribute recomputation is supported for materialized annotations starting with 0.2.2. Ideally a finalized savefile could also store materialized annotations, but no timeline has been established.

Tension configuration

Rebuilt in 0.1.9 to provide better control over slack and buffer tensions separately. Behavior is established based on mathematical distribution, which is uniform stepwise leading to a skewed distribution for overall schedules. Tension settings affect path selection, but the scheduler will fail for the full path if there is insufficient slack/buffer to adjust the path to the goal time. This may change in the future, namely additional tension settings may permit scheduling completion even if the measured slack/buffer wouldn't otherwise permit adjustment. See the distribution in samples/tension.png and documentation in Schedule::Activity.

Tension should also be configurable in the outer scheduling step. This would permit incrementally relaxing the scheduler in case of retries. No timeline has been established.

Tutorial

A basic tutorial and sample configuration is provided starting with 0.2.0. It may be extended.

Action limits

The case limit=1 is not the primary/initial use case of this scheduler, but some events will likely never be repeated. This can already be achieved by setting the attribute to zero initially, incrementing as appropriate, and then filtering. Because there's a difference between limit-per-activity and limit-per-schedule, it's not clear that a special mechanism will be created.

Slack/buffer defaults

As an improvement, support passing slack/buffer ratios during configuration building. Eventually it will be helpful to pass slack/buffer defaults as part of schedule building: Having a value used during schedule building would permit relaxation during retries, and could be reported with the result. This requires changing assumptions in the validators.

Pre-scheduling safety

On by default in 0.1.9, but can be turned off with unsafe=1 and schedule-activity.pl --unsafe. More complex schedules may be difficult to interpret at a glance. One particular annoyance is finding that the target time for an activity cannot be reached, or that there are too many actions to fit a smaller goal window. Convenience functions find the minimum possible activity time (shortest path through the nodes, ultimately), if the activity can be completed at all (sorta easy to forget, and should be checked before attempting scheduling), and the maximum possible activity time (if defined). Moreover, these checks are needed to avoid hanging nodes (that don't reach finish), or action nodes with zero times (that never make progress), orphans, etc.

Script-based tooling

Available in 0.1.8, basic schedule-activity.pl script supports Dumper/JSON schedules and activity lists, compiling with/out safety checks. Future support may provide for common schedule types: Music playlists (high count, non-redundant nodes), exercise schedules (chunking, some repeats), chores/errands (small action count per activity/category), games (rounds, countdown reminders).

In 0.1.9, some annotation handling is provided. Incremental building is supported starting with 0.2.1.

Markdown

Basic Markdown support is likely to change in non-backwards-compatible ways. A written proposal might be posted to ensure support for the common use cases that would aide with faster definitions and imports.

Sample text to speech tool

An HTML+Javascript solution utilizing Web text to speech already exists to handle reminders for schedules of the form hh:mm:ss message # comment and could be provided in samples/.

Additional samples

First, something like a music playlist is similar to the base case here. This is a "large number of random choices" but "each is very fixed in time length". There are multiple potential actions to be randomized. Music has attributes (mood). Scheduling can be arranged in chunks (activities), so there are natural groupings for an arrangement. Scheduling requires Action limits, above, so currently this is slightly difficult and/or requires a helper import mechanism to build the schedules. Moreover, the slack/buffer mechanisms operate 'backwards', in the sense that music+pause periods are fixed and may be impossible to schedule within a fixed/given window of time (hence the common patterns of advertisements between songs and fade-in/out techniques). It's not clear that an arithmetic equivalent of fading will ever be supported in this library. Nevertheless, a "playlist import" type mechanism to build the configurations would be helpful.

Second, something like holiday activities. This is a "small number of choices" but "each is very fluid in length" and has limit=1. An import tool for this type of request should be rather easy, but Action limits are a prerequisite.

Third, scheduling of paired events is not straightforward. An example would be match-off lineups of N teams (eg fantasy leagues). That is less a concern of temporal scheduling and more about uniformity in the lineup. This is possible by running two simultaneous builders on the same configuration, with very fixed times, but may result in self-alignment of activities. It's not clear that this type of scheduling will ever be supported in this library.

Fourth, this may be useful as a test generation tool. The prove command already supports shuffling, but for load and performance testing it's often useful to rerun test workloads and workflows in seemingly random order. This mimics traffic patterns more accurately since similar requests can appear frequently. Nothing in the existing code mandates the unit of time as "seconds", and message objects can be used to represent sequential tests, or a queue potentially offloaded to a number of parallel workers.

Functional improvements

Annotation validation

Annotations need better pre-scheduling validation and better separation from the main scheduling code. Currently unclear of the best place to provide those helpers, as well as annotation-group-merging functions and the associated configurations.

Slackless/Bufferless configurations

Goals can never be met if slack/buffers are zero and the activity time requested doesn't exactly match action choices. This should likely fail with an error similar to the convenience functions mentioned above.

Backtracking behavior

The current mechanism is primarily for safety. Better backtracking support should be possible.

Performance

Both processing time and memory have been secondary considerations in initial versions. Some optimizations are possible, particularly with rolling averages and the main scheduling algorithm.