# Overview

This package implements for Python a memory-efficient representation of closed-interval sets.

The package provides the `procset` module.

A `ProcSet` is an hybrid between a `set` and a `list` of indexes. More precisely, a `ProcSet` object is an ordered collection of unique non-negative `int`. It supports most of `set` operations: notably membership testing, mathematical operations such as intersection, union, and (symmetric) difference; with the additional ability to access its elements by position.

The `ProcSet` type is mutable, as its content can be modified using methods such as `insert()`. Since it is mutable, it has no hash value and cannot be used as either a dictionary key or as an element of another set.

## Example use

You can get the library directly from PyPI:

    pip install procset

What does it look like to use `procset`? Here is a simple example program:

    from procset import ProcSet

    free_cores = ProcSet((0, 7))  # I have 8 cores to work with

    job_cores = ProcSet((2, 5))  # let's use some cores for a job
    free_cores -= job_cores

    print('remaining cores:', str(free_cores))

And it looks like this when run:

    $ python example.py
    remaining cores: 0-1 6-7

## String representation of interval sets

In the scheduling community, interval sets often are encoded as strings where the string `'a-b'` (middle symbol is a dash, ascii `0x2d`) represents the integer interval \([a, b]\), with the convention that the string `a` represents the degenerate case of the singleton \(\{a\}\). An interval set with many disjoint intervals is encoded by joining interval representations with a space (ascii `0x20`): for example `a-b c d-e` represents \([a, b] \cup \{c\} \cup [d, e]\).

Warning

There are many different strings representing the same interval set. For the description of a canonical representation, please refer to the documentation of Batsim.