Algorithm-TimelinePacking

 view release on metacpan or  search on metacpan

examples/basic_usage.pl  view on Meta::CPAN

#!/usr/bin/env perl
#
# Basic usage example of the Algorithm::TimelinePacking module
#
use strict;
use warnings;
use FindBin qw($RealBin);
use lib "$RealBin/../lib";

use Algorithm::TimelinePacking;
use Data::Dumper;

# Create timeline with minimum spacing of 5 units between jobs
my $timeline = Algorithm::TimelinePacking->new(space => 5);

# Sample job data: [start, end, jobid, user, maps, reduces]
my @slices = (
    [1000, 1200, 'job_001', 'alice', 100, 10],
    [1100, 1300, 'job_002', 'bob',   200, 20],  # overlaps with job_001
    [1150, 1400, 'job_003', 'carol', 150, 15],  # overlaps with both
    [1500, 1600, 'job_004', 'alice', 300, 30],  # no overlap
    [1550, 1700, 'job_005', 'dave',  250, 25],  # overlaps with job_004
);

print "Input slices:\n";
for my $s (@slices) {
    printf "  [%4d - %4d] %-8s %s\n", $s->[0], $s->[1], $s->[2], $s->[3];
}

# Arrange slices into non-overlapping lines
my ($lines, $latest) = $timeline->arrange_slices(\@slices);

print "\nArranged into ", scalar(@$lines), " lines:\n";
print "Latest timestamp (normalized): $latest\n\n";

for my $i (0 .. $#$lines) {
    print "Line $i:\n";
    for my $slice (@{$lines->[$i]}) {
        printf "  [%4d - %4d] %-8s %s (maps: %d)\n",
            $slice->[0], $slice->[1], $slice->[2], $slice->[3], $slice->[4];
    }
}



( run in 1.108 second using v1.01-cache-2.11-cpan-39bf76dae61 )