npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

simscript

v1.0.37

Published

A Discrete Event Simulation Library in TypeScript

Downloads

15

Readme

SimScript

A Discrete Event Simulation Library in TypeScript with support for 2D and 3D animations.

The SimScript API Documentation describes all the classes in the SimScript library and their properties.

This Sample shows several simulations, including 2D and 3D animations.

This Sample is written in React. It shows how you can create React components to show simulations, with support for custom parameters and animations. The source code is available on GitHub.

SimScript uses JavaScript's async/await features to make simulation code easy to write and understand.

SimScript simulations are built using these classes:

Simulation Class

Simulations create resources (queues) and entities which execute an async script method that describes the actions each entity should perform.

The Simulation class is abstract. In most cases, you will create classes that extend it to create the queues and entities you need.

Entity Class

Entities represent active elements that execute scripts. Scripts are async methods that contain instructions for entities. Typical actions include entering and leaving queues, going through delays, and sending or waiting for signals.

The Entity class is abstract. In most cases, you will create one or more classes that extend it to perform the actions required by your simulations. The Entity class has an optional generic parameter that contains the type of Simulation it refers to.

Queue Class

Queues represent resources that can be seized and released by entities. Queues keep track of their utilization and may constrain the flow of entities through the simulation.

Animation Class

The Animation class connects a Simulation object to a host element that shows the simulation graphically, rendering entities waiting in queues or in transit between queues.

Animations may be 2D (hosted in regular HTML DIV or SVG elements) or they may be 3D (hosted in X3DOM or A-Frame elements).

Animations are useful for presentations and also for checking and debugging simulations.

Network Class

Networks are defined by sets of nodes and links.

The Network class provides a shortestPath method that returns a list of links so entities may travel along the network.

The Network class has a getLinkDistance that returns the distance represented by a link. You may create classes that extend Network and override this method to provide custom behaviors such as congestion and turning costs. For example:

// network with congestion cost
class CongestionNetwork extends Network {
    getLinkDistance(link: ILink, prevLink?: ILink): number {
        let dist = super.getLinkDistance(link, prevLink); // get regular distance
        dist += dist * link.queue.pop * 0.5; // add congestion cost
        // optionally add turning cost based on link and prevLink...
        return dist;
    }
}

Styles

SimScript includes a CSS file with some simple formatting for the tables and histograms you can create with the Simulation.getStatsTable and Tally.getHistogram methods.

To include that CSS in your projects, add this line to the main ts file in your project:

import "simscript/dist/simscript.css";

Example

This is the classic Barbershop simulation written in SimScript:

// https://try-mts.com/gpss-introduction-and-barber-shop-simulation/
export class BarberShop extends Simulation {
    qJoe = new Queue('Joe', 1);
    qWait = new Queue('Wait Area');

    // generate entities with inter-arrival times of 18 min for 8 hours * 7 days
    onStarting() {
        super.onStarting();
        this.timeEnd = 60 * 8 * 7; // simulation times are in minutes
        this.generateEntities(Customer, new Uniform(18 - 6, 18 + 6));
    }
}
class Customer extends Entity<BarberShop> {
    service = new Uniform(15 - 3, 15 + 3);
    async script() {
        const shop = this.simulation;

        await this.enterQueue(shop.qWait); // enter the line
        await this.enterQueue(shop.qJoe); // seize Joe the barber
        this.leaveQueue(shop.qWait); // leave the line
        await this.delay(this.service.sample()); // get a haircut
        this.leaveQueue(shop.qJoe); // free Joe

        // or do all this with a single call to seize:
        // await this.seize(shop.qJoe, this.service.sample(), shop.qWait);
    }
}

Samples

The links below show some samples of SimScript simulations:

New Samples

  • React Sample
    Shows how you can use SimScript in React. The source code for this sample is available on GitHub.

  • Steering Behaviors
    Shows samples inspired by the article Steering Behaviors For Autonomous Characters. The samples show you can implement entities that navigate around their world in a life-like, improvisational, and composable manner.

  • GPSS-inspired samples
    Shows several samples inspired by traditional GPSS samples published by Minuteman software. The samples show how you can use SimScript to simulate a wide range of practical applications and allow you to compare results obtained by GPSS and SimScript.

  • Asteroids (SVG animation)
    Shows how you can use Simscript to implement a simple arcade game with support for keyboard/touch events, sounds, and collision detection.

Other Samples

Get Involved

If you have any suggestions to improve SimScript, or wish to report any issues, feel free to contact me via email.

You can also use GitHub to submit issues.