diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..5292c375 --- /dev/null +++ b/404.html @@ -0,0 +1,1780 @@ + + + + + + + + + + + + + + + + + + + + + + + kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..2dfaa9ca --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +www.kalasim.org \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..87e14a64 --- /dev/null +++ b/about/index.html @@ -0,0 +1,2116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + About - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

About

+

License

+

kalasim is licensed under MIT License.

+

Acknowledgements

+

salabim

+

kalasim started off as a blunt rewrite of salabim. We are deeply thankful for its permissive licence that enabled setting up kalasim. A great starting point was in particular the wonderful article salabim: discrete event simulation and animation in Python.

+

salabims excellent documentation and wonderful examples made this project possible after all. kalasim reimplements all core APIs of salabim in a more typesafe API while also providing better test coverage, real-time capabilities and (arguably) more modern built-in support for visualization.

+ +

simmer

+

simmer is a process-oriented and trajectory-based Discrete-Event Simulation (DES) package for R.

+

It centres around the concept of a trajectory that defines a component lifecycle. To enable scale it is built on top of Rcpp (C++ backend for R).

+ +

We have adopted several examples and documentation bits from simmer, and are deeply grateful to the simmer developers for providing such a great and well maintained tool. simmer has also been a great source of inspiration to implement in particular the monitoring and visualization API of kalasim.

+

SimJulia

+

SimJulia is a combined continuous time / discrete event process oriented simulation framework written in Julia inspired by the Simula library DISCO and the Python library SimPy.

+

We have adopted several examples and documentation bits from SimJulia, and are deeply grateful its developers for providing such a great and well maintained tool.

+

SimPy

+

SimPy is a process-based discrete-event simulation framework based on standard Python. Processes in SimPy are defined by Python generator functions. SimPy also provides various types of shared resources to model limited capacity congestion points (like servers, checkout counters and tunnels).

+

We have adopted several examples and documentation bits from SimPy, and are deeply grateful its developers for providing such a great and well maintained tool.

+

DSOL

+

DSOL3 which is an open source, Java based suite of Java classes for continuous and discrete event simulation

+ +

Libraries used to build kalasim

+

kalasim is built on top of some great libraries. It was derived as merger of ideas, implementation and documentation from the following projects:

+
    +
  • Kotlin - Not really a library, but for obvious reasons the foundation of this project
  • +
  • koin which is a pragmatic lightweight dependency injection framework for Kotlin developers
  • +
  • Apache Commons Math is a library of lightweight, self-contained mathematics and statistics components
  • +
  • jsonbuilder is a small artifact that serves a single purpose: It allows creating json using an idiomatic kotlin DSL. Its main purpose it to make sure kalasim provides a machine-readable log-format for all basics in a simulation.
  • +
  • kotest.io is a flexible and elegant multiplatform test framework, assertions library, and property test library for Kotlin. We use it to make sure kalasim fulfils its component contract.
  • +
+

Visualization

+ +

Inspirations

+ +

YouKit Profiler

+

With kalasim, we strive to enable large-scale time-discrete simulation models. +To optimize the API and the engine for perormance, we rely +on YourKit profiler. +With its wonderful interface into JDK performace metrics, +YourKit profiler allows us to signifantly improve the overall speed while reducing the memory footprint of kalasim.

+

+

YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET +applications. YourKit is the creator of YourKit Java Profiler.

+

Repo Maintainer

+

Holger Brandl holds a Ph.D. degree in machine learning and has developed new concepts in the field of computational linguistics. More recently he has co-authored publications in high-ranking journals such as Nature and Science.

+

To stay in sync with what's happening in tech, he's developing open-source tools, methods and algorithms for bioinformatics, high-performance computing and data science. He's passionate about machine learning, AI, analytics, elegant APIs and data visualisation. His professional scope mainly centers around systems biology and industrial manufacturing.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/advanced/index.html b/advanced/index.html new file mode 100644 index 00000000..e59c3d73 --- /dev/null +++ b/advanced/index.html @@ -0,0 +1,2110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Advanced - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Advanced

+ +

Clock Synchronization

+

In simulation a clear distinction is made between real time and simulation time. With real time we refer to the wall-clock time. It represents the execution time of the experiment. The simulation time is an attribute of the simulator.

+

To support use cases where a simulation may drive a demonstration or system check, the kalasim API allows to run a simulation at a defined clock speed. Such real-time simulations may be necessary

+
    +
  • If you have hardware-in-the-loop
  • +
  • If the intent of the simulation is to drive a visualization of a process
  • +
  • If there is human interaction with your simulation, or
  • +
  • If you want to analyze the real-time behavior of an algorithm
  • +
+

import org.kalasim.*
+import kotlin.time.Duration.Companion.seconds
+
+val timeBefore = System.currentTimeMillis()
+
+createSimulation {
+    enableComponentLogger()
+
+    // enable real-time clock synchronization
+    ClockSync(tickDuration = 1.seconds)
+
+    run(10)
+}
+
+println("time passed ${System.currentTimeMillis() - timeBefore})")
+
+This example will execute in 10 seconds. Since the simulation is empty (for educational reasons to keep the focus on the clock here), it is entirely idle during that time.

+

To enable clock synchronization, we need to add a ClockSync to our simulation. We need to define what one tick in simulation time corresponds to in wall time. In the example, one tick equals to one second wall time. This is configured with the parameter tickDuration. It defines the duration of a simulation tick in wall clock coordinates. It can be created with Duration.ofSeconds(1), Duration.ofMinutes(10) and so on.

+

ClockSync also provides settings for more advanced uses-cases

+
    +
  • To run simulations, in more than realtime, the user can specify speedUp to run a simulation faster (speedUp > 1) or slower (speedUp < 1) than realtime. It defaults to 1, that is no speed-up will be applied.
  • +
  • The argument syncsPerTick defines how often a clock synchronization should happen. Per default it synchronizes once per tick (i.e. an 1-increment of simulation time).
  • +
+

It may happen that a simulation is too complex to run at a defined clock. In such a situation, it (i.e. Environment.run()) will throw a ClockOverloadException if the user has specified a maximum delay maxDelay parameter between simulation and wall clock coordinates.

+ + +

Operational Control

+

Even if kalasim tries to provide a simplistic, efficient, declarative approach to define a simulation, it may come along with computational demands simulation. To allow introspection into time-complexity of the underlying computations, the user may want to enable the built-in env.tickMetrics monitor to analyze how much time is spent per time unit (aka tick). This monitor can be enabled by calling enableTickMetrics() when configuring the simulation.

+
import org.kalasim.*
+import org.kalasim.plot.letsplot.display
+
+createSimulation {
+    enableTickMetrics()
+
+    object : Component() {
+        override fun process() = sequence {
+            while(true) {
+                // create some artificial non-linear compute load
+                if(nowTT.value < 7)
+                    Thread.sleep((nowTT.value * 100).toLong())
+                else {
+                    Thread.sleep(100)
+                }
+
+                hold(1.minutes)
+            }
+        }
+    }
+
+    run(10.hours)
+
+    tickMetrics.display().show()
+}
+
+

Performance tuning

+

There are multiple ways to improve the performance of a simulation.

+
    +
  1. Disable internal event logging: The interaction model is configured by default to provide insights into the simulation via the event log. However, to optimize performance of a simulation a user may want to consume only custom event-types. If so, internal interaction logging can be adjusted by setting a logging policy.
  2. +
  3. Disable component statistics: Components and queues log various component statistics with built-in monitors which can be adjusted by setting a logging policy to reduce compute and memory footprint of a simulation.
  4. +
  5. Set the correct AssertMode: The assertion mode determines which internal consistency checks are being performed. The mode can be set to Full (Slowest), Light (default) or Off (Fastest). Depending on simulation logic and complexity, this will improve performance by ~20%.
  6. +
+

To further fine-tune and optimize simulation performance and to reveal bottlenecks, a JVM profiler (such as yourkit or the built-in profiler of Intellij IDEA Ultimate) can be used. Both call-counts and spent-time analysis have been proven useful here.

+

Continuous Simulation

+

For some use-cases, simulations may run for a very long simulation and wall time. To prevent internal metrics gathering from consuming all available memory, it needs to be disabled or at least configured carefully. This can be achieved, but either disabling timelines and monitors manually on a per-entity basis, or by setting a sensible default policy via Environment.entityTrackingDefaults

+

For each entity type a corresponding tracking-policy TrackingConfig can be provisioned along with an entity matcher to narrow down its scope. A tracking-policy allows to change

+
    +
  1. How events are logged
  2. +
  3. How internal metrics are gathered
  4. +
+

There are different default implementations, but the user can also implement and register custom tracking-configurations.

+
    +
  • ComponentTrackingConfig
  • +
  • ResourceTrackingConfig
  • +
  • StateTrackingConfig
  • +
  • ComponentCollectionTrackingConfig
  • +
+
//import org.kalasim.*
+import org.kalasim.misc.*
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.minutes
+
+
+class Driver : Resource(trackingConfig = ResourceTrackingConfig(trackUtilization = false))
+class TrafficLight : State<String>("red", trackingConfig = StateTrackingConfig(logCreation = false))
+
+class Car : Component(
+    trackingConfig = ComponentTrackingConfig(logInteractionEvents = false)
+) {
+
+    val trafficLight = get<TrafficLight>()
+    val driver = get<Driver>()
+
+    override fun process() = sequence {
+        request(driver) {
+            hold(30.minutes, description = "driving")
+
+            wait(trafficLight, "green")
+        }
+    }
+}
+
+createSimulation {
+    enableComponentLogger()
+
+    // in addition or alternatively we can also change the environment defaults
+    entityTrackingDefaults.DefaultComponentConfig =
+        ComponentTrackingConfig(logStateChangeEvents = false)
+
+    // create simulation entities
+    dependency { TrafficLight() }
+    dependency { Driver() }
+
+    Car()
+}.run(5.hours)
+
+
+

Note

+

Tracking configuration policies defaults must be set before instantiating simulation entities to be used

+
+

To disable all metrics and to minimize internal event logging, the user can run env.entityTrackingDefaults.disableAll()

+

The same mechanism applies also fine-tune the internal event logging. By disabling some - not-needed for production - events, simulation performance can be improved significantly.

+

Save and Load Simulations

+ + +

kalasim does not include a default mechanism to serialize and deserialize simulations yet. However, it seems that with xstream that Environment can be saved including its current simulation state across all included entities. It can be restored from the xml snapshot and continued with run().

+

We have not succeeded to do the same with gson yet. Also, some experiments with kotlinx.serialization were not that successful.

+

Internal State Validation

+

The simulation engine provides different levels of internal consistency checks. As these are partially computationally expensive these can be be/disabled. There are 3 modes

+
    +
  • OFF - Productive mode, where asserts that may impact performance are disabled.
  • +
  • LIGHT - Disables compute-intensive asserts. This will have a minimal to moderate performance impact on simulations.
  • +
  • FULL - Full introspection, this will have a measurable performance impact on simulations. E.g. it will validate that passive components are not scheduled, and queued components have unique names.
  • +
+

Switching off asserts, will typically optimize performance by another ~20% (depending on simulation logic).

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/analysis/index.html b/analysis/index.html new file mode 100644 index 00000000..4457cdf9 --- /dev/null +++ b/analysis/index.html @@ -0,0 +1,2022 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Analysis - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Analysis

+

A core aspect when building simulations is to understand, define and modulate the inherent system dynamics. To build a correct simulation, the designer/developer must carefully analyze how states progress over time.

+

To facilitate this process, kalasim offers various means to analyze data created by a simulation

+
    +
  • The Event Log tracks events in a simulation
  • +
  • Monitors track state and statistics of the basic elements within a simulation, and may be used for domain-specific entities as well
  • +
  • Lifecycle Records summarize a component's states history
  • +
  • visualization to inspect complex spatio-temporal patterns
  • +
+

Monitors

+

See chapter about monitors.

+

Event Log

+

See chapter about event logging.

+

Visualization

+

See chapter about visualization.

+

Component Status

+

The state transition of a component provide value insight into its behavior. This is facilitated by lifecycle statistics ComponentLifecycleRecord that summarize a component's states history.

+

These data can also be transformed easily into a table as well +

val customers : List<Component> // = ...
+val records: List<ComponentLifecycleRecord> = customers.map { it.toLifeCycleRecord() }
+
+records.asDataFrame()
+

+

This transforms the customers straight into a krangl dataframe with the following structure

+
A DataFrame: 1034 x 11
+      component   createdAt   inCurrent    inData   inDataSince   inInterrupted   inPassive
+ 1    Vehicle.1       0.366           0   989.724        10.276               0           0
+ 2    Vehicle.2       1.294           0   984.423        15.577               0           0
+ 3    Vehicle.3       1.626           0   989.724        10.276               0           0
+ 4    Vehicle.4       2.794           0   989.724        10.276               0           0
+and 1024 more rows, and and 4 more variables: inScheduled, inStandby, inWaiting
+
+

Clearly if needed, the user may also work with the records directly. For instance to configure a visualization.

+

Replication

+

Running a simulation just once, often does not provide sufficient insights into the dynamics of the system under consideration. Often, the user may want to execute a model many times with altered initial conditions, and then perform a statistical analysis over the output. This is also considered as what-if analyis. See here for simple example.

+

By design kalasim does not make use of parallelism. So when scaling up execution to run in paralell, we need to be careful, that the internal dependency injection (which relates by default to a global context variable) does not cause trouble. See here for an example that defines a parameter grid to be assessed with multi-threading with a simulation run per hyper-parameter.

+ + +

Component Tracking

+

To prevent memory leaks, the environment just keeps track of scheduled components, that is components that are queued for execution. In some situations the user may want to track all components irrespective of their queuing status. This can be achieved by setting up a component collector before creating the components

+
createSimulation{
+    val cc = componentCollector()
+
+    // create components
+    Component("foo")
+    Component("bar")
+
+    // analyze all components created until this point
+    cc.size // will be 2
+}
+
+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/animation/1136px-FullMoon2010.jpg b/animation/1136px-FullMoon2010.jpg new file mode 100644 index 00000000..d1b36ba9 Binary files /dev/null and b/animation/1136px-FullMoon2010.jpg differ diff --git a/animation/LunarMiningKt.uml b/animation/LunarMiningKt.uml new file mode 100644 index 00000000..7f257f48 --- /dev/null +++ b/animation/LunarMiningKt.uml @@ -0,0 +1,26 @@ + + + JAVA + org.kalasim.demo.moon.LunarMiningKt + + org.kalasim.demo.moon.LunarMining + org.kalasim.demo.moon.Base + org.kalasim.demo.moon.LunarMiningKt + org.kalasim.demo.moon.DepositMap + org.kalasim.demo.moon.Deposit + org.kalasim.demo.moon.Harvester + + + + + + org.kalasim.demo.moon.DepositMap + + + Methods + Properties + + All + public + + diff --git a/animation/index.html b/animation/index.html new file mode 100644 index 00000000..68d858cb --- /dev/null +++ b/animation/index.html @@ -0,0 +1,2169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Process Animation

+

Animation is a powerful tool to debug, test and demonstrate simulations.

+

It is possible use shapes (lines, rectangles, circles, etc), texts as well image to visualize the state of a simulation model. Statistical properties may be animated by showing the current value against the time.

+

Process animations can be

+
    +
  • Synchronized with the simulation clock and run in real time (synchronized)
  • +
  • Advanced per simulation event (non-synchronized)
  • +
+

How to get started?

+

All it takes is a single dependency

+
dependencies {
+    api("com.github.holgerbrandl:kalasim-animation:0.7.97")
+}
+
+

The dependency pull everything you need to animate simulations.

+

For fully worked out examples, have a look at the lunar mining or the office tower.

+

If you're not sure how to configure gradle, you could also start with the provided processes animation template project.

+

Under the hood

+

OPENRNDR is an open source framework for creative coding, written in Kotlin that simplifies writing real-time interactive software.

+

+For more details see https://openrndr.org/

+

Process animation with kalasim is using OPENRNDR as backend and rendering engine. Animation is not part of the core API of kalasim, but support is provided by a decorator types (extending their respective base-type)

+
    +
  • Component -> AnimationComponent
  • +
  • Resource -> AnimationResource
  • +
  • ComponentQueue -> AnimationResource
  • +
+

These components are worked out below.

+

Animation Template

+

The basic structure of a process animation is as follows

+

// package org.kalasim.animation
+
+import kotlinx.coroutines.*
+import org.kalasim.ClockSync
+import org.kalasim.Environment
+import org.kalasim.misc.DependencyContext
+import org.openrndr.application
+import org.openrndr.color.ColorRGBa
+import org.openrndr.draw.loadFont
+import org.openrndr.draw.loadImage
+import java.awt.geom.Point2D
+import java.lang.Thread.sleep
+import kotlin.time.Duration.Companion.milliseconds
+import kotlin.time.DurationUnit
+
+fun main() {
+    application {
+        // setup simulation model
+        val sim = object : Environment(tickDurationUnit = DurationUnit.SECONDS) {
+            init {
+                ClockSync(tickDuration = 10.milliseconds, syncsPerTick = 100)
+            }
+
+            // instantiate components (not fully worked out here)
+            val worker = AnimationComponent(Point2D.Double(1.0, 3.0))
+        }
+
+        // configure the window
+        configure {
+            width = 1024
+            height = 800
+            windowResizable = true
+            title = "Simulation Name"
+        }
+
+        var frameCounter = 0
+
+        program {
+            // load resources such as images
+            val image = loadImage("src/main/resources/1024px-Phlegra_Montes_on_Mars_ESA211127.jpg")
+//            val truck = loadSVG("src/main/resources/tractor-svgrepo-com.svg")
+            val font = loadFont("file:IBM_Plex_Mono/IBMPlexMono-Bold.ttf", 24.0)
+
+            // optionally enable video recording
+//            extend(ScreenRecorder())
+
+            extend {
+                // draw background
+                drawer.image(image, 0.0, 0.0, width.toDouble(), height.toDouble())
+
+                // visualize simulation entities
+                with(drawer) {
+                    val workerPosition = sim.worker.currentPosition
+                    circle(workerPosition.x, workerPosition.y, 10.0)
+                }
+
+
+                // draw info & statistics
+                drawer.defaults()
+                drawer.fill = ColorRGBa.WHITE
+                drawer.fontMap = font
+                drawer.text("NOW: ${sim.now}", width - 150.0, height - 30.0)
+                drawer.text("Frame: ${frameCounter++}", width - 150.0, height - 50.0)
+            }
+        }
+
+        // Start simulation model
+        CoroutineScope(Dispatchers.Default).launch {
+            //rewire koin context for dependency injection to async execution context
+            DependencyContext.setKoin(sim.getKoin())
+            // wait because Openrndr needs a second to warm up
+            sleep(3000)
+            sim.run()
+        }
+    }
+}
+
+Templates including gradle build files) sources can be found in the repo. F

+

For an in-depth walkthrough of the elements the an animation, see https://guide.openrndr.org/

+

Animating Components

+

By changing the base class of a component from Component to org.kalasim.animation.AnimationComponent, we decorate the original with the following features

+
    +
  • Instances can have an initial position (modelled as Point2D)
  • +
  • With moveTo(newLocation:Point2D) the API provides suspendable wrapper around hold()
  • +
  • While being on hold, an animation can always request the current position with c.currentPosition. Positions are linearly interpolated.
  • +
+

Animating hold() Interactions

+

An animation can track the status hold() interaction with holdProgress. It's a 2 step process

+
    +
  1. +

    First, we need to register what type of holds we would like to monitor +

    val UNLOADING = "Unloading"
    +val c: Component = Component()
    +
    +c.registerHoldTracker(UNLOADING) { it.description.startsWith("unloading")}
    +

    +
  2. +
  3. +

    Once it has been registered, the tracker can be consumed in the rendering loop with isHolding and holdProgress. +

    if(c.isHolding(UNLOADING)) {
    +    drawer.contour(contour.sub(0.0, (1 - c.holdProgress(UNLOADING)!!)))
    +}
    +

    +
  4. +
+

For a fully worked out example, see how the mining process is animated in the lunar mining demo.

+

Animating Resources

+

Dedicated support for resource rendering is coming soon. See lunar mining to see how it's done.

+

Animating States

+

Dedicated support for state rendering is coming soon.

+

Animating Queues & Collections

+

Dedicated support for collection rendering is coming soon.

+

Other animation frontends

+

The animation support API does not bind to a particular rendering engine. However, until now only https://openrndr.org/ has been explored for process animation with kalasim.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/animation/lunar_mining.ipynb b/animation/lunar_mining.ipynb new file mode 100644 index 00000000..eea4183f --- /dev/null +++ b/animation/lunar_mining.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Lunar Mining\n", + "\n", + "Mining robots scan the surface of the moon for depletable water deposits.\n", + "\n", + "From Wikipedia on [Lunar Resources](https://en.wikipedia.org/wiki/Lunar_resources)\n", + "> The Moon bears substantial natural resources which could be exploited in the future. Potential lunar resources may encompass processable materials such as volatiles and minerals, along with geologic structures such as lava tubes that together, might enable lunar habitation. The use of resources on the Moon may provide a means of reducing the cost and risk of lunar exploration and beyond.\n", + "\n", + "In a [not so distant future](https://www.youtube.com/watch?v=Hk2copteiaE), mankind will have established a permanent base on the moon. To fulfil its demand for water, the Earth Space Agency (ESPA) has decided to deploy a fleet of autonomous water-ice mining robots. These robots are designed to first analyze areas for possible water deposits. Detected deposits will be mined, and ice/water will be shipped and stored in the base station. It is a race against time for life and death, because the astronauts are very thirsty.\n", + "\n", + "![The Moon](1136px-FullMoon2010.jpg){: .center}\n", + "\n", + "

\n", + "Full moon photograph taken 10-22-2010 from Madison, Alabama, USA; CC BY-SA 3.0\n", + "

\n", + "\n", + "ESPA has ordered their process specialists to work out a simulation model of the mining process. With the simulation, the number of mining robots needed to supply the base with enough water must be determined. Also, water production rates shall be estimated. \n", + "\n", + "ESPA simulation engineers have to solve two very typical tasks in industrial engineering\n", + "\n", + "1. Capacity Planning (number of mining robots needed)\n", + "2. Forecast of Production KPIs (tons of water/day)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "\n", + "## Simulation Model\n", + "\n", + "There is a complex interplay of rate-limited processes (transport, search, mining), limited resources and the harsh realities of deep space. The latter is abstracted away in the model as it does not contribute to model performance\n", + "\n", + "* While the specific locations of ice-deposits are unknown, their average distribution and size on the moon had been determined already using a [satellite](https://blog.jatan.space/p/how-nasa-and-chandrayaan-discovered-water-on-the-moon) equipped with the onboard radar, ultraviolet detectors as well as a neutron spectrometer\n", + "* Small harvester robots are being deployed from a central depot to scan the lunar surface for water deposits\n", + "* When finding a depot they deplete it\n", + "* They have a limited storage capacity (100kg), so they will need to shuttle the cargo to the base\n", + "* The base will consume water constantly (exponentially distributed with a mean of 5 kg/h)\n", + "* The base has an initial deposit of 100kg water (which was shipped to the moon very expensively with rockets from earth)\n", + "* Idle harvesters will consult the base for nearby deposits discovered by other units\n", + "\n", + "The complete model definition can be found [here](https://github.com/holgerbrandl/kalasim/blob/master/simulations/lunar-mining/src/main/kotlin/org/kalasim/demo/moon/LunarMining.kt). As an example, we inspect the unloading process of water at the base\n", + "\n", + "```kotlin\n", + "fun unload() = sequence {\n", + " moveTo(base.position)\n", + "\n", + " val unloadingUnitsPerHours = 20 // speed of unloading\n", + "\n", + " // unloading time correlates with load status\n", + " currentState = UNLOADING\n", + " hold((tank.level / unloadingUnitsPerHours).roundToInt().hours,\n", + " \"Unloading ${tank.level} water units\")\n", + " \n", + " // put the water into the refinery of the base\n", + " put(get().refinery, tank.level)\n", + " \n", + " // empty the tank\n", + " take(tank, tank.level)\n", + "\n", + " activate(process = Harvester::harvesting)\n", + "}\n", + "```\n", + "Modelled as [process definition](../component.md#process-definition), it can be easily started with [`activate()`](../component.md#activate).\n", + "\n", + "A state variable `currentState` allows for later analysis about what the robots were doing. Unloading is actually separated over 2 independent resources:\n", + "\n", + "* the tank of the mining robot\n", + "* the refinery of the base\n", + "\n", + "Both are modelled as [depletable resource](../resource.md#depletable-resources), so they can be consumed and refilled with `take()` and `put()` respectively.\n", + "\n", + "Once water unloading is complete, another sub-process of the ice harvester is activated: It's going back into harvesting mode, i.e. the robot is returning to its last mined deposit to continue ice collection.\n", + "\n", + "![](lunar_mining_files/lunar_mining_domain_model.png)\n", + "\n", + "

\n", + "API surface of the lunar mining simulation model\n", + "

\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "\n", + "## Process Animation\n", + "\n", + "The model can be expressed easily in approximately 200 lines of [process definitions](../component.md#process-definition) in [`LunarMining.kt`](https://github.com/holgerbrandl/kalasim/blob/master/simulations/lunar-mining/src/main/kotlin/org/kalasim/demo/moon/LunarMining.kt). Howvever, it was not initially clear, if the intended dynamics were implemented correctly. [Process animation](animation.md) comes to resuce, as it allows to debug the model visually.\n", + "\n", + "A process animation was developed as well to better understand the spatio-temporal dynamics of the model. In [LunarMiningHQ.kt](https://github.com/holgerbrandl/kalasim/blob/master/simulations/lunar-mining/src/main/kotlin/org/kalasim/demo/moon/LunarMiningHQ.kt) the animation of this process is worked out in just about 150 lines of code.\n", + "\n", + "\n", + "
\n", + " \n", + "
\n", + "\n", + "We used different capabilties of the [animation system](animation.md) (based on [OPENRNDR](https://openrndr.org/))\n", + "\n", + "* Image background to draw a map of the moon\n", + "* Dynamic shape contour to indicate loading status of the harvesters\n", + "* SVG objects for harvesters and base\n", + "* Automatic video recording\n", + "* Text and simple shapes to draw deposits and process properties \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Supply Optimization\n", + "\n", + "To assess how many ice harvesters are needed to ensure base survival we can play what-if with our model. We do so in a fully reproducible manner right in place here. First we load `kalasim` and import required classes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "@file:Repository(\"*mavenLocal\")\n", + "\n", + "%useLatestDescriptors on\n", + "%use kalasim(0.7.94)\n", + "%use kravis(0.8.4)\n", + "\n", + "@file:DependsOn(\"org.kalasim.demo:lunar-mining:1.0-SNAPSHOT\")\n", + "\n", + "import org.kalasim.demo.moon.*\n", + "import krangl.asDataFrame\n", + "import krangl.bindRows\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "Next we can run the simulation multiple times with different numbers of robots and compare the outcome." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "execution": { + "iopub.execute_input": "2021-11-21T20:08:39.777233Z", + "iopub.status.busy": "2021-11-21T20:08:39.777233Z", + "iopub.status.idle": "2021-11-21T20:08:40.107114Z", + "shell.execute_reply": "2021-11-21T20:08:40.107114Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "val sims = List(9) { numHarvesters ->\n", + " List(100) {\n", + " LunarMining(numHarvesters+1, 15, false, it).apply { run(60*60) }\n", + " }\n", + "}.flatten()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To work with the data, we first combine the refinery water level timelines into a data-frame." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "val waterSupply = sims.withIndex().map { (idx, sim) ->\n", + " sim.base.refinery.levelTimeline//.statistics()\n", + " .stepFun()\n", + " .asDataFrame()\n", + " .addColumn(\"num_harvesters\") { sim.harvesters.size }\n", + " .addColumn(\"run\") { idx }\n", + "}.bindRows()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First, we can study the water level in the central refinery across all the 100 simuation runs. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCASwCowDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAI5Zo4FDSNtBOM4zUX9oWv/PX/wAdP+FRar/x6r/vj+RrHoA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAN3+0LX/nr/46f8KP7Qtf+ev/AI6f8KwqKAN3+0LX/nr/AOOn/Cj+0LX/AJ6/+On/AArCooA3f7Qtf+ev/jp/wo/tC1/56/8Ajp/wrCooA3f7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACsKigDd/tC1/56/+On/Cj+0LX/nr/wCOn/CsKigDd/tC1/56/wDjp/wo/tC1/wCev/jp/wAKwqKAOmooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAK39oWv8Az1/8dP8AhR/aFr/z1/8AHT/hWFRQBu/2ha/89f8Ax0/4Uf2ha/8APX/x0/4VhUUAbv8AaFr/AM9f/HT/AIUf2ha/89f/AB0/4VhUUAbv9oWv/PX/AMdP+FH9oWv/AD1/8dP+FYVFAG7/AGha/wDPX/x0/wCFH9oWv/PX/wAdP+FYVFAG7/aFr/z1/wDHT/hR/aFr/wA9f/HT/hWFRQBu/wBoWv8Az1/8dP8AhR/aFr/z1/8AHT/hWFRQBu/2ha/89f8Ax0/4Uf2ha/8APX/x0/4VhUUAbv8AaFr/AM9f/HT/AIUf2ha/89f/AB0/4VhUUAbv9oWv/PX/AMdP+FH9oWv/AD1/8dP+FYVFAG7/AGha/wDPX/x0/wCFH9oWv/PX/wAdP+FYVFAG7/aFr/z1/wDHT/hR/aFr/wA9f/HT/hWFRQBu/wBoWv8Az1/8dP8AhR/aFr/z1/8AHT/hWFRQBu/2ha/89f8Ax0/4Uf2ha/8APX/x0/4VhUUAbv8AaFr/AM9f/HT/AIUf2ha/89f/AB0/4VhUUAbv9oWv/PX/AMdP+FH9oWv/AD1/8dP+FYVFAG7/AGha/wDPX/x0/wCFH9oWv/PX/wAdP+FYVFAG7/aFr/z1/wDHT/hR/aFr/wA9f/HT/hWFRQBu/wBoWv8Az1/8dP8AhR/aFr/z1/8AHT/hWFRQBu/2ha/89f8Ax0/4Uf2ha/8APX/x0/4VhUUAbv8AaFr/AM9f/HT/AIUf2ha/89f/AB0/4VhUUAbv9oWv/PX/AMdP+FH9oWv/AD1/8dP+FYVFAG7/AGha/wDPX/x0/wCFH9oWv/PX/wAdP+FYVFAG7/aFr/z1/wDHT/hR/aFr/wA9f/HT/hWFRQBu/wBoWv8Az1/8dP8AhR/aFr/z1/8AHT/hWFRQBu/2ha/89f8Ax0/4Uf2ha/8APX/x0/4VhUUAbv8AaFr/AM9f/HT/AIUf2ha/89f/AB0/4VhUUAbv9oWv/PX/AMdP+FH9oWv/AD1/8dP+FYVFAG7/AGha/wDPX/x0/wCFH9oWv/PX/wAdP+FYVFAG7/aFr/z1/wDHT/hR/aFr/wA9f/HT/hWFRQBu/wBoWv8Az1/8dP8AhR/aFr/z1/8AHT/hWFRQBu/2ha/89f8Ax0/4Uf2ha/8APX/x0/4VhUUAbv8AaFr/AM9f/HT/AIUf2ha/89f/AB0/4VhUUAbv9oWv/PX/AMdP+FH9oWv/AD1/8dP+FYVFAG7/AGha/wDPX/x0/wCFH9oWv/PX/wAdP+FYVFAG7/aFr/z1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AFFFFABRRRQAUUUUAFFFFABRWfHrmmy65Lo0d0r6hFF50kKgnavHU4xnkcZzzWhQAUUVl6X4i0rWrq8ttPuvOmsn2XC+Wy7GyRjJAzyp6Z6UAalFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFQ3V3b2Ns9zdTxwwRjLSSMFUD6mpVYOgZTlSMg0ALRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAdNRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAczRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFV76/tNNtXur65it4E+9JKwUfr3rnYPiR4QuLkQJrUQcnAMkbov8A30ygfrQHmdVRSI6yIrowZWGQwOQR60tABRWXL4i0qDX4dDkutupTJvjh8tjlcE53Y2/wnv2rUoAKKKKACiiigAooooAKKKKACiiigAoooJAGTwKACioLW8tr6EzWs8c0QYpvjbIyDgjP1qegAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK3dP8A+PGP8f5msKt3T/8Ajxj/AB/maALNFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWHqH/H9J+H8hW5WHqH/AB/Sfh/IUAVaKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAormLv4h+E7K8NrPrMPmg4Plo7qD/vKCP1roLS8tr+2S5s7iK4gf7skThlP4ijzAnoorM1vxDpfh22juNVuvs8Uj+WjeWz5bGcfKD6UAadFICCAR0NLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRUCXttLeS2kc8b3EShpI1bLID0yO2cGgCeiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo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5cP8+tAFWiiigAooooAKKKKACiiigAooooAKln/5Z/7gqKpZ/wDln/uCgCKiiigAooooAKKKKACiiigAooooAltv9ev4/wAqLn/Xt+H8qLb/AF6/j/Ki5/17fh/KgCKiiigAooooAKKKKACiiigAooooAltv9ev4/wAqiqW2/wBev4/yqKgAooooAKKKKACiiigAooooAKKKKALUH/HrJ+P8qq1ag/49ZPx/lVWgAooooAKKKKACiiigAooooAKKKKAJZP8AURfj/Ooqlk/1EX4/zqKgAooooAKKKKACiiigAooooAKKKKALV5/B+NVatXn8H41VoAKKKKACiiigAooooAKKhyzudp/Wl2Sf3v1qeYCWnxf61P8AeFV/3op0fm+an+8PSjm8gJpf9a/+8aZTJPN81/8AePpTf3v+cUc3kBLRTU3Y+brTqoAooooAsWn+tP8Au1cqnaf60/7tXKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAILv8A1Q/3qpVeuG2Rg7VbnowzVbz/APplH/3zQBFRUvn/APTKP/vmjz/+mUf/AHzQA+0/1p/3ail/1r/7xqxbyb5CNiLx1UYqN5sSMPLjOCeStAEFFS+f/wBMo/8Avmjz/wDplH/3zQBFRUvn/wDTKP8A75o8/wD6ZR/980ARUVL5/wD0yj/75o8//plH/wB80ARUVL5//TKP/vmjz/8AplH/AN80ARUVL5//AEyj/wC+aPP/AOmUf/fNABB/y0/3DUVWYpd2/wDdoMITwKj8/wD6ZR/980ARUVL5/wD0yj/75o8//plH/wB80ARUVL5//TKP/vmjz/8AplH/AN80ARUVL5//AEyj/wC+aPP/AOmUf/fNAEVFS+f/ANMo/wDvmjz/APplH/3zQBFRUvn/APTKP/vmjz/+mUf/AHzQBL/y4f59aq1d3/6Jv2r9Mcdar+f/ANMo/wDvmgCKipfP/wCmUf8A3zR5/wD0yj/75oAioqXz/wDplH/3zR5//TKP/vmgCKipfP8A+mUf/fNHn/8ATKP/AL5oAioqXz/+mUf/AHzR5/8A0yj/AO+aAIqKl8//AKZR/wDfNHn/APTKP/vmgAn/AOWf+4KiqzLLt2fu0OUB5FR+f/0yj/75oAioqXz/APplH/3zR5//AEyj/wC+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/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH+FH9oXX/AD1/8dH+FAG5RWH/AGhdf89f/HR/hR/aF1/z1/8AHR/hQBuUVh/2hdf89f8Ax0f4Uf2hdf8APX/x0f4UAblFYf8AaF1/z1/8dH+FH9oXX/PX/wAdH+FAG5RWH/aF1/z1/wDHR/hR/aF1/wA9f/HR/hQBuUVh/wBoXX/PX/x0f4Uf2hdf89f/AB0f4UAblFYf9oXX/PX/AMdH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jt7eG0t47e3jWOGNQiIowFA6AVJVSd2SlZBVC5/17fh/Kr9ULn/Xt+H8qQyKiiigAq1/y4f59aq1a/5cP8+tAFWiiigAooooAKKKKACiiigAooooAKln/wCWf+4KiqWf/ln/ALgoAiooooAKKKKACiiigAooooAKKKKAJbb/AF6/j/Ki5/17fh/Ki2/16/j/ACouf9e34fyoAiooooAKKKKACiiigAooooAKKKKAJbb/AF6/j/Koqltv9ev4/wAqioAKKKKACiiigAooooAKKKKACiiigC1B/wAesn4/yqrVqD/j1k/H+VVaACiiigAooooAKKKKACiiigAooooAlk/1EX4/zqKpZP8AURfj/OoqACiiigAooooAKik5kUdqlqLrPTRM+wvkr6mjyV9TUlFF2HKiPyV9TUUsQLKuTVjcv94fnUKsrTE7l496abJko7E95ZAFMOcc9RVUWhByH/TFad46/J8w796ozSqkZO4fnTUpCdOmtSH9+zEK/wCtKTJDGSx5P0pYp1C54yfeoZplknCAHAqkne1jJtJXT1HLLNjIOc+tO86f0FSfugAAGGKqyyh32RhiB1oWvQJNxW4S3E5IXA/So/NYMflwT70sUCO2SWwParSQxA5LH8qtuK0MlGc9blN2KKG2An65xUv2mbbu28fU1YkEe0YJx1NKo3YycAVLkrbFqm07JlX7XLjlT+Zpi3jvMgKEjcPfNXpGjHyLtpQsSlB8mSwzQpLsEoT/AJiJrwK7AI33j2qnd6gW2xqhyT6VbmijMrhdg5OflFUlgjkm6p6dBVRUb3ZnUlUtypmhYvvgORgg4PFWait4VhQhcHJ5IqWsZNN6HbTTUUmFFFFSWWLT/Wn/AHauVTtP9af92rlABRRRQAUUUUAFFFFABRRVb+0LIXi2ZvLf7U33YfNXef8AgOc9jQBZopAQc4IOOD7UtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBBd/6of71Uqu3f+qH+9VKgAooooAsWn+tP+7UUv8ArX/3jUtp/rT/ALtRS/61/wDeNADKKKKACiiigAooooAKKKKACiiigCWD/lp/uGoqlg/5af7hqKgAooooAKKKKACiiigAooooAKKKKALX/Lh/n1qrVr/lw/z61VoAKKKKACiiigAooooAKKKKACiiigCWf/ln/uCoqln/AOWf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Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+On/CgCzRVb+0LX/nr/46f8KP7Qtf+ev/AI6f8KALNFVv7Qtf+ev/AI6f8KP7Qtf+ev8A46f8KALNFVv7Qtf+ev8A46f8KP7Qtf8Anr/46f8ACgCzRVb+0LX/AJ6/+On/AAo/tC1/56/+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oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigC9pX/H03+4f5itisfSv+Ppv9w/zFbFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFHVf+PVf98fyNY9bGq/8eq/74/kax6ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqre6bY6nGsd/ZW13GrblWeJZAD6gEdatUUAGMDAooooAKq2um2FjLNLaWVtbyTndK8MSoZDzyxA56nr61aooArXun2WpQiG/s7e6iDbgk8SuoPrgjryanEaCPywi7MbduOMemKdRQBmweHtEtbgXFvo+nxTg5EkdsisD65AzVhdNsE1Br9bK2F6w2tcCJfMI6YLYz2H5VaooAqxabYQXst7DZW0d3KMSTpEodx7sBk9B+VWqKKAKsWm2EF7Lew2VtHdyjEk6RKHce7AZPQflVqiigChe6JpOpSCS+0uyupAMBp7dHIH1Iq3BBDawrDbxRxRIMKkahVH0AqSigCC6s7W+gMF5bQ3EJ6xzIHU/gaisdI03TCxsNOtLQv97yIVjz9cCrlFADJoYriF4Z4klicYZHUMrD0IPWq9jpenaYrrp9ha2iucuLeFY931wBmrdFAFC90TSdSkEl9pdldSAYDT26OQPqRVuCCG1hWG3ijiiQYVI1CqPoBUlFAFVtNsG1Bb9rK2N6o2rcGJfMA6YDYzjk1aoooAzbjw9ol3cG4udH0+acnJkktkZifqRmtFVVFCqoVQMAAYApaKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA6aiiigAooqG5u7ayhM13cRQRDgvK4VR+JoAmoqnZatpupMy2OoWl0yjLCCZXI+uDVygAoqne6tpumsq32oWlqW5UTzKmfpk1YgnhuYVmglSWJhlXjYMp+hFAElFFZ8eu6RNdfZYtVsXuM7fKW4Qvn0xnNAGhRRUN1eWtjAZ7u5ht4hwZJnCKPxNAE1FVrPUbHUUZ7G9t7pFOC0EquB+RqzQAUUUUAczRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUABAIweRWbH4d0SK5FzHo2npODkSraoGz65xmtKigAooooAqvpthJfpfvZWzXqDalwYlMijngNjI6n86nlijnheGaNZInUq6OMhgeoIPUU+igCC0srTT7cW9law20IJIjhjCKCevA4qrceH9FvLk3NzpFhPOeTLLbIzH8SM1o0UAVLjStOu/I+02FrN9nOYfMhVvK6fdyOOg6elLcabYXdzDc3NlbTTwHMUskSs0Z6/KSMj8KtUUAFVbjTbC7uYbm5sraaeA5ilkiVmjPX5SRkfhVqigAqteafZajEIr60t7qMHISeMOM/QirNFAFWy02w01GSwsra1RjkrBEqA/kKssquhR1DKwwQRkEUtFAGbb+HtFtLkXNto+nwzg5EsdsisD9QM1pUUUAUYdE0q2vTewaZZRXRyTOluquc9fmAzUt5p9lqMQivrS3uowchJ4w4z9CKs0UAVbLTbDTUZLCytrVGOSsESoD+QovdNsdSREvrK2ulRtyCeJXCn1GRwatUUAFU77SNM1Mqb/AE60uyv3TPAsmPpkVcooAhtbO1sYBBaW0NvCOkcKBFH4CpqKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArd0//jxj/H+ZrCrd0/8A48Y/x/maALNFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWHqH/H9J+H8hW5WHqH/H9J+H8hQBVooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAM6fQNGuro3VxpNhNcHkyyWyM5/EjNaAAAAAwB0ApaKACqt7ptjqcax39lbXcatuVZ4lkAPqAR1q1RQAYwMCqtvpthaXM1zbWVtDPOcyyxxKrSHOcsQMnn1q1RQBTvtJ03U9n9oafaXez7v2iFZNv0yOKQaRpgsGsBp1oLNvvW/kL5Z+q4x2H5VdooAqSaVp01gthLYWr2a4C27QqYxjphcYqxFFHBEkUSLHGihURBgKB0AHYU+igCC7srTULc297aw3MJIJjmjDqSOnB4qSKKOCJIokWONFCoiDAUDoAO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/wDln/uCgBvmyf32/OjzZP77fnTKKAH+bJ/fb86PNk/vt+dMooAf5sn99vzo82T++350yigB/myf32/OjzZP77fnTKKAH+bJ/fb86PNk/vt+dMooAngdzMoLsRzwT7UTu4mYB2A44B9qbbf69fx/lRc/69vw/lQA3zZP77fnR5sn99vzplFAD/Nk/vt+dHmyf32/OmUUAP8ANk/vt+dHmyf32/OmUUAP82T++350ebJ/fb86ZRQA/wA2T++350ebJ/fb86ZRQBPA7mZQXYjngn2qPzZP77fnTrb/AF6/j/KoqAH+bJ/fb86PNk/vt+dMooAf5sn99vzo82T++350yigB/myf32/OjzZP77fnTKKAH+bJ/fb86PNk/vt+dMooAf5sn99vzo82T++350yigC3CzG2kJYkjPOfaq/myf32/Op4P+PWT8f5VVoAf5sn99vzo82T++350yigB/myf32/OjzZP77fnTKKAH+bJ/fb86PNk/vt+dMooAf5sn99vzo82T++350yigB/myf32/OjzZP77fnTKKAJ3dxDEQ7ZOcnPvUfmyf32/OnSf6iL8f51FQA/zZP77fnR5sn99vzplFAD/ADZP77fnR5sn99vzplFAD/Nk/vt+dHmyf32/OmUUAP8ANk/vt+dHmyf32/OmUUAP82T++350ebJ/fb86ZRQBbu2Zdm1iOvQ1X82T++351PefwfjVWgB/myf32/OjzZP77fnTKaXAOOaASuS+bJ/fb86QyyAZ3t+dRCRfcUM42HBFA7Md9pk/vN/31THunOF3vnvzUSYbknANSKIwckgn6UzSyQ8TdtzfjS+d/tmm/uz6fypD5Q6kfnQSSCcjpIw/E0+O4JkQGRsZHc1B+6/vL+dGYgy8jqO9AJJi3F4QZAjt1IHJqpb3cis2GPOf4qkm2Bn6dSetQ2yjDY+nFUrWN4qKg9C/FcSSKTvbg4+9Unmyf32/OoYk8tce+afUM5pWvoP82T++350ebJ/fb86ZRQIs2rs0pDMSMdzVuqdp/rT/ALtXKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAILv/VD/eqlV64bZGDtVuejDNVvP/6ZR/8AfNAEVFS+f/0yj/75o8//AKZR/wDfNAD7T/Wn/dqKX/Wv/vGrFvJvkI2IvHVRio3m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vVlZPMVMKEcE5YgdWFdN4ctJ7DwvpFncp5dxb2UMUqZB2sqAEZHB5HatOigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPM/wDhE9b/AOF4/wDCR/Yv+JT/AM/Hmp/z7bPu53fe46V6ZRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcz8QdJvdc8Dajp2nQefdzeV5ce9VziVGPLEDoD3rpqKAOZ+H2k3uh+BtO07UYPIu4fN8yPerYzK7DlSR0I7101FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV5n4y8J63qvxQ8P6xZWXm2Fp9m8+XzUXZsmZm4JBOAQeBXplFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWZ4jtJ7/wAL6vZ2yeZcXFlNFEmQNzMhAGTwOT3rTooA4b4VeHtU8N+F7mz1e1+zXD3rSqnmK+VKIAcqSOqmu5oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvM/i54T1vxP/AGP/AGPZfafs/n+b+9RNu7y8feIz909PSvTKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8z8G+E9b0r4oeINYvbLyrC7+0+RL5qNv3zKy8AkjIBPIr0yigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOG+Kvh7VPEnhe2s9ItftNwl6srJ5iphQjgnLEDqwrpvDlpPYeF9Is7lPLuLeyhilTIO1lQAjI4PI7Vp0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeZ/8Inrf/C8f+Ej+xf8Sn/n481P+fbZ93O773HSvTKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA5n4g6Te654G1HTtOg8+7m8ry496rnEqMeWIHQHvR8PtJvdD8Dadp2oweRdw+b5ke9WxmV2HKkjoR3rpqKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8z8ZeE9b1X4oeH9YsrLzbC0+zefL5qLs2TMzcEgnAIPAr0yiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPM/hH4T1vwx/bH9sWX2b7R5HlfvUfdt8zP3ScfeHX1r0yiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKrahfQ6Zp1xfXBxDBGZHPsBVmuT+JUrReAtSKHBYIp+hdc1MnZaDirs5jS7XxZ4+jk1dtem0awZ2W2its5IBwc7WXPpknrngCtDw5ret6H4rHhfxJci6E6brO7PVuvBPU5wRzyCMcgiun8GQrb+DNHRRgG1R/wAWG4/zrk/iJ+48X+EblCBJ9p2++N6f4mtLWmorbYm94uXzPSKKKKkYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFRzzw20DzTypFEgyzyMFVR6knpUlUdX0m21vTJdPvA5t5Su8I2CcMGxn8KGC8zyzx18R5L0Cy8PTzxWySAS3sRKFz1CqeoHB+uPTr6+nMak+gry/wCKemWWkeEtMtNPto7eBbzhEHfY3JPUn3NeoR/6tfoKa+H5/oge69Dz/wASa7rWteKx4V8OXAtTGm+7uh1UcZAPUYyOnJJxxzWfqll4v8CRJq8evTazYowFzFcbsgE4/iLYHuCCM9MZq14AUz+OfF10/Miz+WD7F2/+JFdd4uiWbwfrCNjH2SQ8+oUkfyqL8sFLruO15uPyLA12yPh3+3A5+x/Z/tGe+MZx9e31rz7S7XxZ4+jk1dtem0awZ2W2its5IBwc7WXPpknrngCoI7mX/hQjfNyCY8/7PnV33gyFbfwZo6KMA2qP+LDcf51bSvLyJTdl/WxzHhzW9b0PxWPC/iS5F0J03Wd2erdeCepzgjnkEY5BFanjzxRdaFbWljpah9Vv38uDIB2cgZweCckAZ4/Ksb4ifuPF/hG5QgSfadvvjen+Jo8QKbn4zaBA/KRweYo9x5jf0FJe8o37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oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK85+NHizV/CHg2G60aZILm4uhAZSgYopViSueM8DnBr0avm3496B4ktr+bWrrV/N0G4uY47ax+0yN5T+XyfLI2D7rcg9/eon2Lh3PdfBdxNd+BtBubmV5p5dPgeSSRizOxQEkk9Sa5vw38MP+Ee+Iuq+Lf7Y+0fbzMfsv2bZ5fmOG+/vOcYx0Fc/8G/CvjDS/smr6tr32vRLnTV+y2f2yaTyt2xk+RgFXCgjg8ZwKzvh/r2sXvx58S6ddatfz2MLXflW0ty7RJiUAbVJwMDgYraX8XTez+XkZL+Hrtdf8Oe5UV4J8ZPGGueFvibosmm3t35CWiSmxS4dYpm8xxhkU4bOAPfFMufgp4u8X2/9s+JPFQTVpFMiWrRGRISeQm4MAnvtUge9Zp3jzFtWdj36ivl7wh408exC8+HthI0+rPcGCC5nk3GyVdwl+Y54GOD25wMkVf8AFHwS8QaDpNz4ng8UyX+p2qm4mJRo5MAZZllLkkgc84z+lNtJc3QEm3bqfSVFeefBnxbe+LfAwm1KQy3tnO1tJMRzIAAVY++GwfpXCeLPFPir4j+Ornwf4Oums9PsyyXFyjmPftOGZnHIXPygDr/Ikmpcq3FFpx5me/UV8+v+zxremxm/0fxf/wATRPmTELwfN1OJFckfXFdZ8IvHuq6zcX/hXxOCNd0zI3sBukRTtYNjgspxyOoIPqS1rp1E3bXoerUUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXjv7R3/Ih6f/ANhFf/Rb17FXk37QtjPd/DuKeFGdbW9SSXapO1SrLk+gyR+dRU2+a/MuG/3/AJHceAv+Se+HP+wbb/8Aota8d+G3/JxXir/evP8A0ctdb8IviZpWv6dpnhaK1u4tRstPVXd1XymEYVflO7OTwenrXJfDb/k4rxV/vXn/AKOWt3rXv3UjJfwbecRfi9Ctx8cvCELgFZFtVIPobhq+gq8B+K3/ACXrwZ/26f8ApS1e/VnD+EvVlz/ifJfkfPnw3AP7RfikkDIa8x7fvlr2vxWA3g7W1YAg2E4IPf8AdtXinw2/5OK8Vf715/6OWvbPFX/Ioa1/14T/APos1E/93j/h/wAyo/x3/i/yPLv2dSw8CauV+8L5sfXy0ryn4df8LCe81Z/A2DMSn2xj9n3Yy23/AF3vu6fj2r1j9m//AJErVP8AsIH/ANFpXKavDrnwS+Id1rdjZG68Pai5yMkIVY7vLLc7XU5wT1H4gazsqmvVL8v1M4602l3/AFZo/wDGQ/8An+z6k+H/AIK+IVr8VovE/ifT9glWQXVwJrf5iYyo+WNvUL0Fadx+0l4eWwZ7bRdUe828RSeWke7/AHwxOP8AgNTfCC98d+JNYv8AxFrt7cxaJPloLV1GyRj08sMCVRR3BGTjk80RvzX9RStynsdFFFSUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFNdEkRkdVZGGGVhkEehp1FAGXYeGtB0q6N1p2iabZ3DAgy29qkbkHryoBqS20HR7LUZdRtdJsIL6bd5tzFbIsr5OTuYDJyeTmtCigDPu9C0e/v4b+80qxuLyDHk3E1ujyR4ORtYjIweeO9aFFFAGfbaDo9lqMuo2uk2EF9Nu825itkWV8nJ3MBk5PJzV2WKOeF4Zo0kikUq6OMqwPBBB6in0UeQeZS03SNM0aBoNL060sYnbe0drAsSs3TJCgc8CrckaSxtHIiujDDKwyCPcU6igDFh8H+GLe5FxB4c0iKcHIlSxjVgfqFzW1RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//Z" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "waterSupply\n", + " .addColumn(\"num_harvesters\"){\n", + " it[\"num_harvesters\"].map{ it.toString()+ \" harvesters\"}\n", + " }\n", + " .plot(x = \"time\", y = \"value\", group=\"run\", color=\"num_harvesters\")\n", + " .geomLine( alpha = .1)\n", + " .facetWrap(\"num_harvesters\", scales=FacetScales.free_y)\n", + " .guides(color=LegendType.none)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With more ice harvesters working around the base, supply of water is ensured. Initially there is a phase, were no deposits are yet discovererd, so the base is under a severe risk of running dry. To assess how often this happens, we count the number of runs per harvester where the base's refinery was depleted. " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCASwCowDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAi+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBoCeIkANyfY0rypGcM2D9Koxf61P8AeFS3f+tH+7QBP9pi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gj7TF/f8A0NUKKAL/ANpi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gj7TF/f8A0NUKKAL/ANpi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gj7TF/f8A0NUKKAL/ANpi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gj7TF/f8A0NUKKAL/ANpi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gj7TF/f8A0NUKKAL/ANpi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gj7TF/f8A0NUKKAL/ANpi/v8A6Gj7TF/f/Q1QooAv/aYv7/6Gn+Ynl78/L64rNq1/y4f59aAJftMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NH2mL+/+hqhRQBf+0xf3/wBDR9pi/v8A6GqFFAF/7TF/f/Q0faYv7/6GqFFAF/7TF/f/AENH2mL+/wDoaoUUAX/tMX9/9DR9pi/v/oaoUUAX/tMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NH2mL+/+hqhRQBf+0xf3/wBDR9pi/v8A6GqFFAF/7TF/f/Q0faYv7/6GqFFAF/7TF/f/AENH2mL+/wDoaoUUAX/tMX9/9DR9pi/v/oaoUUAX/tMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NKs0bsFVsk+1Z9S23+vX8f5UAW2mjRirNgj2pPtMX9/9DVW5/wBe34fyqKgC/wDaYv7/AOho+0xf3/0NUKKAL/2mL+/+ho+0xf3/ANDVCigC/wDaYv7/AOho+0xf3/0NUKKAL/2mL+/+ho+0xf3/ANDVCigC/wDaYv7/AOho+0xf3/0NUKKAL/2mL+/+ho+0xf3/ANDVCigC/wDaYv7/AOho+0xf3/0NUKKAL/2mL+/+ho+0xf3/ANDVCigC/wDaYv7/AOho+0xf3/0NUKKAL/2mL+/+ho+0xf3/ANDVCigC/wDaYv7/AOho+0xf3/0NUKKAL/2mL+/+ho+0xf3/ANDVCigC/wDaYv7/AOho+0xf3/0NUKKANLzE8vfn5fXFM+0xf3/0NRf8uH+fWqtAF/7TF/f/AENH2mL+/wDoaoUUAX/tMX9/9DR9pi/v/oaoUUAX/tMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NH2mL+/+hqhRQBf+0xf3/wBDR9pi/v8A6GqFFAF/7TF/f/Q0faYv7/6GqFFAF/7TF/f/AENH2mL+/wDoaoUUAX/tMX9/9DR9pi/v/oaoUUAX/tMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NH2mL+/+hqhRQBf+0xf3/wBDR9pi/v8A6GqFFAF/7TF/f/Q0faYv7/6GqFFAF/7TF/f/AENH2mL+/wDoaoUUAaKSpIcK2T9KQzxAkFuR7Gq9p/rT/u1FL/rX/wB40AXPtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q0faYv7/wChqhRQBf8AtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q0faYv7/wChqhRQBf8AtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q0faYv7/wChqhRQBf8AtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q0faYv7/wChqhRQBf8AtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q0faYv7/wChqhRQBf8AtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q0faYv7/wChqhRQBf8AtMX9/wDQ0faYv7/6GqFFAF/7TF/f/Q09pEVAxPynocVm1an/AOPWP8P5UAS/aYv7/wCho+0xf3/0NUKKAL/2mL+/+ho+0xf3/wBDVCigC/8AaYv7/wCho+0xf3/0NUKKAL/2mL+/+ho+0xf3/wBDVCigC/8AaYv7/wCho+0xf3/0NUKKAL/2mL+/+ho+0xf3/wBDVCigC/8AaYv7/wCho+0xf3/0NUKKAL/2mL+/+ho+0xf3/wBDVCigC/8AaYv7/wCho+0xf3/0NUKKAL/2mL+/+ho+0xf3/wBDVCigC/8AaYv7/wCho+0xf3/0NUKKAL/2mL+/+ho+0xf3/wBDVCigC/8AaYv7/wCho+0xf3/0NUKKAL/2mL+/+hpySpIcK2T9KzqsWn+tP+7QBYM8QJBbkexpPtMX9/8AQ1Tl/wBa/wDvGmUAX/tMX9/9DR9pi/v/AKGqFFAF/wC0xf3/ANDR9pi/v/oaoUUAX/tMX9/9DR9pi/v/AKGqFFAF/wC0xf3/ANDR9pi/v/oaoUUAX/tMX9/9DR9pi/v/AKGqFFAF/wC0xf3/ANDR9pi/v/oaoUUAX/tMX9/9DR9pi/v/AKGqFFAF/wC0xf3/ANDR9pi/v/oaoUUAX/tMX9/9DR9pi/v/AKGqFFAF/wC0xf3/ANDR9pi/v/oaoUUAX/tMX9/9DR9pi/v/AKGqFFAF/wC0xf3/ANDR9pi/v/oaoUUAX/tMX9/9DR9pi/v/AKGqFFAGk8iR43HGfamfaYv7/wChqK8/g/GqtAF/7TF/f/Q0faYv7/6GqFFAF/7TF/f/AENH2mL+/wDoaoUUAX/tMX9/9DR9pi/v/oaoUUAX/tMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NH2mL+/+hqhRQBf+0xf3/wBDR9pi/v8A6GqFFAF/7TF/f/Q0faYv7/6GqFFAF/7TF/f/AENH2mL+/wDoaoUUAX/tMX9/9DR9pi/v/oaoUUAX/tMX9/8AQ0faYv7/AOhqhRQBf+0xf3/0NH2mL+/+hqhRQBf+0xf3/wBDR9pi/v8A6GqFFAF/7TF/f/Q0faYv7/6GqFFAGkkiSZ2nOPamfaYv7/6GorP+P8Kq0AX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NH2mL+/8AoaoUUAX/ALTF/f8A0NH2mL+/+hqhRQBf+0xf3/0NKs0bsFVsk+1Z9S23+vX8f5UAX6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDLooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHxf61P94VLd/60f7tRRf61P8AeFS3f+tH+7QBXooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKtf8uH+fWqtWv+XD/PrQBVooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKltv9ev4/yqKpbb/Xr+P8qAC5/17fh/Koqluf8AXt+H8qioAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALX/Lh/n1qrVr/lw/z61VoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALFp/rT/ALtRS/61/wDeNS2n+tP+7UUv+tf/AHjQAyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq1P8A8esf4fyqrVqf/j1j/D+VAFWiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqxaf60/7tV6sWn+tP+7QBFL/AK1/940yny/61/8AeNMoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK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cfNHnWpf8hW8/wCu7/8AoRqrVrUv+Qref9d3/wDQjVWvJluz7el/Dj6IKKKKRoFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWp4d/wCQ7bf8C/8AQTWXWp4d/wCQ7bf8C/8AQTV0/jXqc+K/gT9H+R3dFFFeofGGD4s/5BUX/Xcf+gtXHV2Piz/kFRf9dx/6C1cdXn4n4z6jKf8Adl6sKKKKwPTCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA9F03/kFWf/AFwT/wBBFWqq6b/yCrP/AK4J/wCgirVetHZHxFX+JL1YV5hXp9eYVyYroezkn/Lz5fqFFFFch7wUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAG94T/5Csv8A1wP/AKEtdjXHeE/+QrL/ANcD/wChLXY16GG+A+Wzb/eX6IK5jxh/y5f8D/8AZa6euY8Yf8uX/A//AGWnX/hsjLP96j8/yZy9FFFecfWBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFei6b/AMgqz/64J/6CK86r0XTf+QVZ/wDXBP8A0EV1YXdni51/Dj6lqqupf8gq8/64P/6CatVV1L/kFXn/AFwf/wBBNdktmeFS/iR9UedUUUV5J9uFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV1Hg//AJff+Af+zVy9dR4P/wCX3/gH/s1bUP4iODM/91l8vzR09FFFeifJhUtt/r1/H+VRVLbf69fx/lQBfooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMuiiigAooooA4TxF/yHbn/gP/AKCKy61PEX/Iduf+A/8AoIrLry6nxv1Ps8L/AAIei/IKKKKg6AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK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P+u7/wDoRqrVrUv+Qref9d3/APQjVWvJluz7el/Dj6IKKKKRoFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABWp4d/5Dtt/wAC/wDQTWXWp4d/5Dtt/wAC/wDQTV0/jXqc+K/gT9H+R3dFFFeofGGD4s/5BUX/AF3H/oLVx1dj4s/5BUX/AF3H/oLVx1efifjPqMp/3ZerCiiisD0wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPRdN/5BVn/ANcE/wDQRVqqum/8gqz/AOuCf+girVetHZHxFX+JL1YV5hXp9eYVyYroezkn/Lz5fqFFFFch7wUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAG94T/wCQrL/1wP8A6EtdjXHeE/8AkKy/9cD/AOhLXY16GG+A+Wzb/eX6IK5jxh/y5f8AA/8A2WunrmPGH/Ll/wAD/wDZadf+GyMs/wB6j8/yZy9FFFecfWBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFei6b/yCrP/AK4J/wCgivOq9F03/kFWf/XBP/QRXVhd2eLnX8OPqWqq6l/yCrz/AK4P/wCgmrVVdS/5BV5/1wf/ANBNdktmeFS/iR9UedUUUV5J9uFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV1Hg/8A5ff+Af8As1cvXUeD/wDl9/4B/wCzVtQ/iI4Mz/3WXy/NHT0UUV6J8mFS23+vX8f5VFUtt/r1/H+VAF+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAy6KKKACiiigDhPEX/Iduf8AgP8A6CKy61PEX/Iduf8AgP8A6CKy68up8b9T7PC/wIei/IKKKKg6AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKtab/y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UUAdj4T/AOQVL/13P/oK1vVg+E/+QVL/ANdz/wCgrW9Xp0fgR8fjv95n6hXCeIv+Q7c/8B/9BFd3XCeIv+Q7c/8AAf8A0EVlivgXqdeTfx36fqjLooorhPpQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALWm/8AIVs/+u6f+hCvRa8603/kK2f/AF3T/wBCFei124XZnz2dfxI+gVg+LP8AkFRf9dx/6C1b1YPiz/kFRf8AXcf+gtW1b4GcGB/3mHqcdRRRXmH2AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXd+Hf+QFbf8AAv8A0I1wld34d/5AVt/wL/0I104X436Hk5z/AAF6/ozUoooruPmjzrUv+Qref9d3/wDQjVWrWpf8hW8/67v/AOhGqteTLdn29L+HH0QUUUUjQKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACtTw7/AMh22/4F/wCgmsutTw7/AMh22/4F/wCgmrp/GvU58V/An6P8ju6KKK9Q+MMHxZ/yCov+u4/9BauOrsfFn/IKi/67j/0Fq46vPxPxn1GU/wC7L1YUUUVgemFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB6Lpv/IKs/8Argn/AKCKtVV03/kFWf8A1wT/ANBFWq9aOyPiKv8AEl6sK8wr0+vMK5MV0PZyT/l58v1CiiiuQ94KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDe8J/8AIVl/64H/ANCWuxrjvCf/ACFZf+uB/wDQlrsa9DDfAfLZt/vL9EFcx4w/5cv+B/8AstdPXMeMP+XL/gf/ALLTr/w2Rln+9R+f5M5eiiivOPrAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvRdN/5BVn/wBcE/8AQRXnVei6b/yCrP8A64J/6CK6sLuzxc6/hx9S1VXUv+QVef8AXB//AEE1aqrqX/IKvP8Arg//AKCa7JbM8Kl/Ej6o86oooryT7cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig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MPU46iiivMPsAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACu78O/wDICtv+Bf8AoRrhK7vw7/yArb/gX/oRrpwvxv0PJzn+AvX9GalFFFdx80edal/yFbz/AK7v/wChGqtWtS/5Ct5/13f/ANCNVa8mW7Pt6X8OPogooopGgUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFanh3/AJDtt/wL/wBBNZdanh3/AJDtt/wL/wBBNXT+Nepz4r+BP0f5Hd0UUV6h8YYPiz/kFRf9dx/6C1cdXY+LP+QVF/13H/oLVx1efifjPqMp/wB2XqwooorA9MKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD0XTf+QVZ/8AXBP/AEEVaqrpv/IKs/8Argn/AKCKtV60dkfEVf4kvVhXmFen15hXJiuh7OSf8vPl+oUUUVyHvBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAb3hP/kKy/wDXA/8AoS12Ncd4T/5Csv8A1wP/AKEtdjXoYb4D5bNv95fogrmPGH/Ll/wP/wBlrp65jxh/y5f8D/8AZadf+GyMs/3qPz/JnL0UUV5x9YFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV6Lpv8AyCrP/rgn/oIrzqvRdN/5BVn/ANcE/wDQRXVhd2eLnX8OPqWqq6l/yCrz/rg//oJq1VXUv+QVef8AXB//AEE12S2Z4VL+JH1R51RRRXkn24UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXUeD/8Al9/4B/7NXL11Hg//AJff+Af+zVtQ/iI4Mz/3WXy/NHT0UUV6J8mFS23+vX8f5VFUtt/r1/H+VAF+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiorm5gs7d7i6njggjGXklcKqj1JPArDsvHXhbUtX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/wBfDf8AoK101eNiP4sj9Fyr/cqfoFcJ4i/5Dtz/AMB/9BFd3XCeIv8AkO3P/Af/AEEVwYr4F6n02Tfx36fqjLooorhPpQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALWm/8hWz/wCu6f8AoQr0WvOtN/5Ctn/13T/0IV6LXbhdmfPZ1/Ej6BWD4s/5BUX/AF3H/oLVvVg+LP8AkFRf9dx/6C1bVvgZwYH/AHmHqcdRRRXmH2AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXd+Hf+QFbf8C/9CNcJXd+Hf+QFbf8AAv8A0I104X436Hk5z/AXr+jNSiiiu4+aPOtS/wCQref9d3/9CNVatal/yFbz/ru//oRqrXky3Z9vS/hx9EFFFFI0CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArU8O/8h22/4F/6Cay61PDv/Idtv+Bf+gmrp/GvU58V/An6P8ju6KKK9Q+MMHxZ/wAgqL/ruP8A0Fq46ux8Wf8AIKi/67j/ANBauOrz8T8Z9RlP+7L1YUUUVgemFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB6Lpv/ACCrP/rgn/oIq1VXTf8AkFWf/XBP/QRVqvWjsj4ir/El6sK8wr0+vMK5MV0PZyT/AJefL9QooorkPeCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA3vCf/IVl/64H/0Ja7GuO8J/8hWX/rgf/Qlrsa9DDfAfLZt/vL9EFcx4w/5cv+B/+y109cx4w/5cv+B/+y06/wDDZGWf71H5/kzl6KKK84+sCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK9F03/kFWf/XBP/QRXnVei6b/AMgqz/64J/6CK6sLuzxc6/hx9S1VXUv+QVef9cH/APQTVqqupf8AIKvP+uD/APoJrslszwqX8SPqjzqiiivJPtwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuo8H/8vv8AwD/2auXrqPB//L7/AMA/9mrah/ERwZn/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09FFFeifJhUtt/r1/H+VRVLbf69fx/lQBfooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD5z8XfDr4k6p491DXdLtY7ZvPcW1za3MVvIY8kKSVIOduBk8+tWY9G+Pccaot+5AGBuubdj+Z5Nek+PPipoXgPFtcB7zU3XctnAQCo7F2PCj8z7VyXg7426j4r8d2GhSaDDYW90HJLSs8i4jZwRwBzgdqUFf3V0HN/aZi/2T8fP+f5v+/8AbV7hoCahH4d01NWbdqS20YujkHMu0buRx1z0riovjDoyfES78JX0D2xjnFvBeFwUkkwPlYY+X5jgHkeuK9Gqk7xutmS171uwUUUUhhRRRQAUUUUAFFFFABRRRQAUUUUAZdFFFABRRRQB5n4r/wCRlu/+Af8AoC1jVs+K/wDkZbv/AIB/6AtY1e3S/hx9EfmmP/3qr/il+bCiiitDlCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq7pH/ACGrD/r4j/8AQhVKrukf8hqw/wCviP8A9CFTP4Wa0P4sfVfmesUUUV4R+oGN4r/5Fq7/AOAf+hrXmdemeK/+Rau/+Af+hrXmdengv4b9T4riT/eo/wCFfmwooorsPnwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAO/8D/8AIFm/6+G/9BWumrmfA/8AyBZv+vhv/QVrpq8bEfxZH6LlX+5U/QK4TxF/yHbn/gP/AKCK7uuE8Rf8h25/4D/6CK4MV8C9T6bJv479P1Rl0UUVwn0oUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAFrTf8AkK2f/XdP/QhXotedab/yFbP/AK7p/wChCvRa7cLsz57Ov4kfQKwfFn/IKi/67j/0Fq3qwfFn/IKi/wCu4/8AQWrat8DODA/7zD1OOooorzD7AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAru/Dv/ICtv8AgX/oRrhK7vw7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BRRRQAUUUUAFFFFAHoum/wDIKs/+uCf+girVJpVpu0iybf1gQ9P9kVb+x/8ATT9K9aOyPiKv8SXqyrXmFes/Y/8App+leTVyYroezkn/AC8+X6hRRRXIe8FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBveE/wDkKy/9cD/6EtdjXI+DYvN1eVc4/cE9P9pa7j7H/wBNP0r0MN8B8tm3+8v0RVrmPGH/AC5f8D/9lrsfsf8A00/SuT8bQ+V9h+bOfM7f7tOv/DZGWf71H5/kzkqKKK84+sCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK9F03/kFWf/AFwT/wBBFedV6dpVpu0iybf1gQ9P9kV1YXdni51/Dj6i1V1L/kFXn/XB/wD0E1qfY/8App+lVNVtNukXrb+kDnp/smuyWzPCpfxI+qPMaKKK8k+3CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK6jwf/wAvv/AP/Zq5eut8Ew+b9u+bGPL7f71bUP4iODM/91l8vzR0VFWvsf8A00/Sj7H/ANNP0r0T5Mq1Lbf69fx/lUv2P/pp+lPjtvLkDb847YoAnooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiignAJobtqBmazrOh6VbhNb1GwtYZgVC3kyIJB3ADHmuGa5+DDyeYR4S3e0UIH5YxXk3hPwxP8Z/H2t6lrN/PDaQNufyyC4DMRHGuQQAAp5wenTnNemf8M8eC8f6/Vv/AAIT/wCIoSdk31HLRuPY6mz8efD/AE61S1sde0S2t04SKCRERfoBwK6u1uoL20hurWVJreZBJHIhyrqRkEH0Iryz/hnjwX/z21b/AMCF/wDiK9M0rTYNH0iz0y2LmC0hSCMucttUADJ9cCnpYnqXKKKKQwooooAparqtnoumzX99KI4IhknuT2AHcmvOobTWfidepdXwew8NRPmKEHDT47+/16DoMnJrX8f+Edc8VXFmljdWcVnApYxzuwJk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cf8AIFh/6+F/9BaufD/xYnq5r/uVT0OAooor2T86CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK9M8Kf8i1af8AA/8A0Nq8zr0zwp/yLVp/wP8A9DauPG/w16n0HDf+9S/wv80bNFFFeYfank+r/wDIav8A/r4k/wDQjVKrur/8hq//AOviT/0I1Sr3YfCj8vr/AMWXq/zCiiiqMgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK2fCn/Iy2n/A//QGrGrZ8Kf8AIy2n/A//AEBqzq/w5ejOrAf71S/xR/NHplFFFeIfpZg+LP8AkFRf9dx/6C1cdXY+LP8AkFRf9dx/6C1cdXn4n4z6jKf92XqwooorA9MKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigD0XTf8AkFWf/XBP/QRVqqum/wDIKs/+uCf+girVetHZHxFX+JL1YV41XsteNV6OB+18v1PkOJ/+XX/b36BRRRXefKhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAdN4H/5DU3/Xu3/oS139cB4H/wCQ1N/17t/6Etd/XlYv+KfdcP8A+5L1YVzHjD/ly/4H/wCy109cx4w/5cv+B/8AstefX/hs+qyz/eo/P8mcvRRRXnH1gUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXoum/wDIKs/+uCf+givOq9F03/kFWf8A1wT/ANBFdWF3Z4udfw4+paqrqX/IKvP+uD/+gmrVVdS/5BV5/wBcH/8AQTXZLZnhUv4kfVHnVFFFeSfbhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFdR4P/wCX3/gH/s1cvXUeD/8Al9/4B/7NW1D+IjgzP/dZfL80dPRRRXonyYVLbf69fx/lUVS23+vX8f5UAX6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC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e05r28v+CXT4x/tGSwvseXm6819tduVdu52VFFFQdQVLbf69fx/lUVS23+vX8f5UAX6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAry7UYH8e/EafSLiaRNI0pcvGhxvcYB/Ek4+gOMZr1GvN/h3tPjLxexOX+1cfTe+f6UL4tfMHpF/Ih8XeA7HQtKOu+HPNsbywxKQsjOGUHk/MSQR+WM8V3fh3Vhrnh6x1LaFaeIF1HQMOGx7ZBqLxWFPhHWA4yPscv8A6CaxvheSfAVjk9Hl/wDQzQuq9AfRnY0VzPjnRtd1zRIbbw/qX9n3a3KyPL57xZQKwK5QE9Spx04rz/8A4V58TP8AocP/ACp3P/xNAHqVFWvPg/55f+Oijz4P+eX/AI6KAKtFWvPg/wCeX/joo8+D/nl/46KAPKfFf/Iy3f8AwD/0Baxq9P1LwtpOqahLeTSXiSSYysbIFGABxkH0qp/wg+i/899Q/wC+0/8Aia9OniqcYJM+MxWR4upXnUilZtvfuzzuivRP+EH0X/nvqH/faf8AxNH/AAg+i/8APfUP++0/+JqvrlI5/wDV/G9l9553RXon/CD6L/z31D/vtP8A4mj/AIQfRf8AnvqH/faf/E0fXKQf6v43svvPO6K9E/4QfRf+e+of99p/8TR/wg+i/wDPfUP++0/+Jo+uUg/1fxvZfeed0V6J/wAIPov/AD31D/vtP/iaP+EH0X/nvqH/AH2n/wATR9cpB/q/jey+887or0T/AIQfRf8AnvqH/faf/E0f8IPov/PfUP8AvtP/AImj65SD/V/G9l9553RXoq+BdFZgonv8k4++n/xNOk8BaNE21ri/zjPDp/8AE0fXKQf6v43svvPOKK9E/wCEH0X/AJ76h/32n/xNH/CD6L/z31D/AL7T/wCJo+uUg/1fxvZfeed0V6J/wg+i/wDPfUP++0/+Jo/4QfRf+e+of99p/wDE0fXKQf6v43svvPO6K9E/4QfRf+e+of8Afaf/ABNH/CD6L/z31D/vtP8A4mj65SD/AFfxvZfeed0V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Pov/AD31D/vtP/iaP+EH0X/nvqH/AH2n/wATR9cpB/q/jey+887or0T/AIQfRf8AnvqH/faf/E0f8IPov/PfUP8AvtP/AImj65SD/V/G9l9553RXon/CD6L/AM99Q/77T/4mj/hB9F/576h/32n/AMTR9cpB/q/jey+887or0T/hB9F/576h/wB9p/8AE0+PwFo0rbVuL/OM8un/AMTR9cpB/q/jey+884or0VvAuiqxUz3+QcffT/4mk/4QfRf+e+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/AMTR/wAIPov/AD31D/vtP/iaPrlIP9X8b2X3nndFeif8IPov/PfUP++0/wDiaP8AhB9F/wCe+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/xNH/CD6L/AM99Q/77T/4mj65SD/V/G9l9553RXon/AAg+i/8APfUP++0/+Jo/4QfRf+e+of8Afaf/ABNH1ykH+r+N7L7zzuivRP8AhB9F/wCe+of99p/8TR/wg+i/899Q/wC+0/8AiaPrlIP9X8b2X3mD4H/5DU3/AF7t/wChLXf1naP4e0zRbt7m3e6kdozGRKVIwSD2A54rb8+D/nl/46K4cRUU580T6nKcLUwuGVOpvdlWuN8e/wDMP/7af+y13nnwf88v/HRWVrWjadrvkfaTcR+Tu2+TtGc465B9KmhNQqKTLzPDzxGFlSp7u35pnktFeif8IPov/PfUP++0/wDiaP8AhB9F/wCe+of99p/8TXofXKR8n/q/jey+887or0T/AIQfRf8AnvqH/faf/E0f8IPov/PfUP8AvtP/AImj65SD/V/G9l9553RXon/CD6L/AM99Q/77T/4mj/hB9F/576h/32n/AMTR9cpB/q/jey+887or0T/hB9F/576h/wB9p/8AE0f8IPov/PfUP++0/wDiaPrlIP8AV/G9l9553RXon/CD6L/z31D/AL7T/wCJo/4QfRf+e+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/AMTR/wAIPov/AD31D/vtP/iaPrlIP9X8b2X3nndFekS+AdHixuuL/n0dP/iaj/4QfRf+e+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/AMTR/wAIPov/AD31D/vtP/iaPrlIP9X8b2X3nndFeif8IPov/PfUP++0/wDiaP8AhB9F/wCe+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/xNH/CD6L/AM99Q/77T/4mj65SD/V/G9l9553RXon/AAg+i/8APfUP++0/+Jo/4QfRf+e+of8Afaf/ABNH1ykH+r+N7L7zzuivRP8AhB9F/wCe+of99p/8TR/wg+i/899Q/wC+0/8AiaPrlIP9X8b2X3nndesaR/yBbD/r3j/9BFZf/CD6L/z31D/vtP8A4mumtRa2lpDbIjMkMaxqWAJIAxz71zYmtCokontZLltfCVJSq21Xciqlq/8AyBb/AP695P8A0E1r+fB/zy/8dFRXQtbu0mtnRlSaNo2KgAgEY4965IuzTPdqxcqcorqmeK0V6J/wg+i/899Q/wC+0/8AiaP+EH0X/nvqH/faf/E16n1ykfEf6v43svvPO6K9E/4QfRf+e+of99p/8TR/wg+i/wDPfUP++0/+Jo+uUg/1fxvZfeed0V6J/wAIPov/AD31D/vtP/iaP+EH0X/nvqH/AH2n/wATR9cpB/q/jey+887or0T/AIQfRf8AnvqH/faf/E0f8IPov/PfUP8AvtP/AImj65SD/V/G9l9553RXon/CD6L/AM99Q/77T/4mj/hB9F/576h/32n/AMTR9cpB/q/jey+887or0T/hB9F/576h/wB9p/8AE0f8IPov/PfUP++0/wDiaPrlIP8AV/G9l9553RXpEXgHR5c7bi/49XT/AOJqP/hB9F/576h/32n/AMTR9cpB/q/jey+887or0T/hB9F/576h/wB9p/8AE0f8IPov/PfUP++0/wDiaPrlIP8AV/G9l9553RXon/CD6L/z31D/AL7T/wCJo/4QfRf+e+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/AMTR/wAIPov/AD31D/vtP/iaPrlIP9X8b2X3nndFeif8IPov/PfUP++0/wDiaP8AhB9F/wCe+of99p/8TR9cpB/q/jey+887or0T/hB9F/576h/32n/xNH/CD6L/AM99Q/77T/4mj65SD/V/G9l9553XZ+Av+Yh/2z/9mrR/4QfRf+e+of8Afaf/ABNa2i6Np2hef9mNxJ523d5204xnpgD1rKviYTpuKO/LMnxOHxUatRKyv18mi3RVrz4P+eX/AI6KPPg/55f+OivPPrCrUtt/r1/H+VS+fB/zy/8AHRT45YWkAWPDeuBQBPRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeXJex+CPifqEmo5i07Vl3pPt+UNnPP0OQfqDXqNUtT0nT9ZtTbajaRXMWchXHQ+oPUH3FLZ3QbqzOL8feMdLfw5PpmmXsN7e3wESJbOJMAnnJX24A6810/hLSn0Xwrp9hKAJY4syAdmYliPzNR6V4L8O6LdC5sNLijnH3ZHZpCv03E4/Ct6mtELcKKKKBmXRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAPi/wBan+8Klu/9aP8AdqKL/Wp/vCpbv/Wj/doAr0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFWv+XD/PrVWrX/AC4f59aAKtFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABUtt/r1/H+VRVLbf69fx/lQAXP+vb8P5VFUtz/AK9vw/lUVABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBa/5cP8+tVatf8uH+fWqtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBYtP8AWn/dqKX/AFr/AO8altP9af8AdqKX/Wv/ALxoAZRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVan/49Y/w/lVWrU//AB6x/h/KgCrRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVYtP9af92q9WLT/Wn/doAil/1r/7xplPl/1r/wC8aZQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAWrz+D8aq1avP4PxqrQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAWrP+P8ACqtWrP8Aj/CqtABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVLbf69fx/lUVS23+vX8f5UAX6KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDLooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAHxf61P94VLd/60f7tRRf61P94VLd/60f7tAFeiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq1/y4f59aq1a/wCXD/PrQBVooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKltv9ev4/wAqiqW2/wBev4/yoALn/Xt+H8qiqW5/17fh/KoqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigC1/wAuH+fWqtWv+XD/AD61VoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALFp/rT/u1FL/AK1/941Laf60/wC7UUv+tf8A3jQAyiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAq1P/x6x/h/KqtWp/8Aj1j/AA/lQBVooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKsWn+tP+7VerFp/rT/u0ARS/61/940yny/61/wDeNMoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKALV5/B+NVatXn8H41VoAKKKKACiiigAooooAKKKKACiiigAooooAKKKK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AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAMzxHaT3/hfV7O2TzLi4spookyBuZkIAyeBye9cz8KvD2qeG/C9zZ6va/Zrh71pVTzFfKlEAOVJHVTXc0UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXmf8Awiet/wDC8f8AhI/sX/Ep/wCfjzU/59tn3c7vvcdK9MooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuZ+IOk3uueBtR07ToPPu5vK8uPeq5xKjHliB0B7101FAHM/D7Sb3Q/A2nadqMHkXcPm+ZHvVsZldhypI6Ed66aiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8z/wCET1v/AIXj/wAJH9i/4lP/AD8ean/Pts+7nd97jpXplFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQBw3xV8Pap4k8L21npFr9puEvVlZPMVMKEcE5YgdWFdN4ctJ7DwvpFncp5dxb2UMUqZB2sqAEZHB5HatOigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8z8G+E9b0r4oeINYvbLyrC7+0+RL5qNv3zKy8AkjIBPIr0yigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4b4q+HtU8SeF7az0i1+03CXqysnmKmFCOCcsQOrCu5ooAzPDlpPYeF9Is7lPLuLeyhilTIO1lQAjI4PI7Vp0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHm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iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK5T4heNbXwN4Xm1GUq93JmOzgP8Ay0kI4/4COpP9SKTdlcaV3Y8G+OkWm6N8QWn0S7eHULu2P9oxQnCqXGOSO7qeR9D3r1z4Iafodp8O7a40eTzpbli17I4AfzhwUI7Adh6HPeuY+DvgF9TjuvGnipPtl3qiuII7hd2Y3yGkOf7wJA9F+vGFY3Fz8Dvig9hcySt4W1Q7kY5IVCeG/wB5Dwe5XnHIqoLk9x7v/h7EzfN766f8Nf8Ar8T6MopsciTRJJG6vG4DKynIIPQg06kMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACs7U9A0bWmjbVdIsL9ogRGbq2SUpnrjcDjoK0aKAGxxpFGscaKiIAqqowAB0AFU9T0XStajjj1XTLK/SMlkW6gWUKfUBgcVeooeoEVvbQWdtHbWsMcEEShI4olCqijoABwBUtFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//2Q==" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sims.map { sim ->\n", + " (\"h \"+sim.harvesters.size) to\n", + " sim.base.refinery.levelTimeline.statistics().min\n", + "}.plot(x={ first}, fill={second==0.0})\n", + " .geomBar()\n", + " .labs(x=\"# harvesters\", y=\"# simulation runs\", fill = \"Base Depleted?\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "As shown in the figure, it turns out, that with >=5 ice harvestering robots, the risk of water supply depletion at the base station is within an acceptable range.\n", + "\n", + "We have just analyzed our lunar mining model using controlled randomization, and have performed a basic capacity analysis.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Exercise: Maintenance Module\n", + "\n", + "The model could be extended to model robot health as well\n", + "\n", + "* Occasional meteoroids hits will affect the harvester health status (with the varying amount, and which eventually will lead to robot outage)\n", + "* Harvesters health is slowly decreasing while depleting deposits\n", + "* Harvesters can be repaired in a special maintenance depot (which is a bit far off), so they must sure to get their in time because picking up broken robots in the field is very time consumin & expensive\n", + "\n", + "\n", + "## Summary\n", + "\n", + "ESPA is relieved. The simulation model showed that sufficient water-supplies can be gathered with 5 mining robots. The astronauts can even take a shower every Sunday from now on.\n", + "\n", + "Using a discrete event simulation model built with `kalasim`, we have animated the process and have analyzed its statistical properties." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Kotlin", + "language": "kotlin", + "name": "kotlin" + }, + "language_info": { + "codemirror_mode": "text/x-kotlin", + "file_extension": ".kt", + "mimetype": "text/x-kotlin", + "name": "kotlin", + "nbconvert_exporter": "", + "pygments_lexer": "kotlin", + "version": "1.6.20-dev-6372" + }, + "pycharm": { + "revision": "c3a766ca-2abf-479a-9482-d1b3498c7c91" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} \ No newline at end of file diff --git a/animation/lunar_mining/index.html b/animation/lunar_mining/index.html new file mode 100644 index 00000000..84af1afa --- /dev/null +++ b/animation/lunar_mining/index.html @@ -0,0 +1,2177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lunar Mining - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Lunar Mining

+

Mining robots scan the surface of the moon for depletable water deposits.

+

From Wikipedia on Lunar Resources

+
+

The Moon bears substantial natural resources which could be exploited in the future. Potential lunar resources may encompass processable materials such as volatiles and minerals, along with geologic structures such as lava tubes that together, might enable lunar habitation. The use of resources on the Moon may provide a means of reducing the cost and risk of lunar exploration and beyond.

+
+

In a not so distant future, mankind will have established a permanent base on the moon. To fulfil its demand for water, the Earth Space Agency (ESPA) has decided to deploy a fleet of autonomous water-ice mining robots. These robots are designed to first analyze areas for possible water deposits. Detected deposits will be mined, and ice/water will be shipped and stored in the base station. It is a race against time for life and death, because the astronauts are very thirsty.

+

The Moon

+

+Full moon photograph taken 10-22-2010 from Madison, Alabama, USA; CC BY-SA 3.0 +

+ +

ESPA has ordered their process specialists to work out a simulation model of the mining process. With the simulation, the number of mining robots needed to supply the base with enough water must be determined. Also, water production rates shall be estimated.

+

ESPA simulation engineers have to solve two very typical tasks in industrial engineering

+
    +
  1. Capacity Planning (number of mining robots needed)
  2. +
  3. Forecast of Production KPIs (tons of water/day)
  4. +
+

Simulation Model

+

There is a complex interplay of rate-limited processes (transport, search, mining), limited resources and the harsh realities of deep space. The latter is abstracted away in the model as it does not contribute to model performance

+
    +
  • While the specific locations of ice-deposits are unknown, their average distribution and size on the moon had been determined already using a satellite equipped with the onboard radar, ultraviolet detectors as well as a neutron spectrometer
  • +
  • Small harvester robots are being deployed from a central depot to scan the lunar surface for water deposits
  • +
  • When finding a depot they deplete it
  • +
  • They have a limited storage capacity (100kg), so they will need to shuttle the cargo to the base
  • +
  • The base will consume water constantly (exponentially distributed with a mean of 5 kg/h)
  • +
  • The base has an initial deposit of 100kg water (which was shipped to the moon very expensively with rockets from earth)
  • +
  • Idle harvesters will consult the base for nearby deposits discovered by other units
  • +
+

The complete model definition can be found here. As an example, we inspect the unloading process of water at the base

+

fun unload() = sequence {
+    moveTo(base.position)
+
+    val unloadingUnitsPerHours = 20  // speed of unloading
+
+    // unloading time correlates with load status
+    currentState = UNLOADING
+    hold((tank.level / unloadingUnitsPerHours).roundToInt().hours,
+         "Unloading ${tank.level} water units")
+
+    // put the water into the refinery of the base
+    put(get<Base>().refinery, tank.level)
+
+     // empty the tank
+    take(tank, tank.level)
+
+    activate(process = Harvester::harvesting)
+}
+
+Modelled as process definition, it can be easily started with activate().

+

A state variable currentState allows for later analysis about what the robots were doing. Unloading is actually separated over 2 independent resources:

+
    +
  • the tank of the mining robot
  • +
  • the refinery of the base
  • +
+

Both are modelled as depletable resource, so they can be consumed and refilled with take() and put() respectively.

+

Once water unloading is complete, another sub-process of the ice harvester is activated: It's going back into harvesting mode, i.e. the robot is returning to its last mined deposit to continue ice collection.

+

+

+API surface of the lunar mining simulation model +

+ +

Process Animation

+

The model can be expressed easily in approximately 200 lines of process definitions in LunarMining.kt. Howvever, it was not initially clear, if the intended dynamics were implemented correctly. Process animation comes to resuce, as it allows to debug of the model vsually.

+

A process animation was developed as well to better understand the spatio-temporal dynamics of the model. In LunarMiningHQ.kt the animation of this process is worked out in just about 150 lines of code.

+
+ +
+ +

We used different capabilties of the animation system (based on OPENRNDR)

+
    +
  • Image background to draw a map of the moon
  • +
  • Dynamic shape contour to indicate loading status of the harvesters
  • +
  • SVG objects for harvesters and base
  • +
  • Automatic video recording
  • +
  • Text and simple shapes to draw deposits and process properties
  • +
+

Supply Optimization

+

To assess how many ice harvesters are needed to ensure base survival we can play what-if with our model. We do so in a fully reproducible manner right in place here. First we load kalasim and import required classes.

+
@file:Repository("*mavenLocal")
+
+%useLatestDescriptors on
+%use kalasim(0.7.94)
+%use kravis(0.8.4)
+
+@file:DependsOn("org.kalasim.demo:lunar-mining:1.0-SNAPSHOT")
+
+import org.kalasim.demo.moon.*
+import krangl.asDataFrame
+import krangl.bindRows
+
+

Next we can run the simulation multiple times with different numbers of robots and compare the outcome.

+
val sims = List(9) { numHarvesters ->
+    List(100) {
+        LunarMining(numHarvesters+1, 15, false, it).apply { run(60*60) }
+    }
+}.flatten()
+
+

To work with the data, we first combine the refinery water level timelines into a data-frame.

+
val waterSupply = sims.withIndex().map { (idx, sim) ->
+    sim.base.refinery.levelTimeline//.statistics()
+        .stepFun()
+        .asDataFrame()
+        .addColumn("num_harvesters") { sim.harvesters.size }
+        .addColumn("run") { idx }
+}.bindRows()
+
+

First, we can study the water level in the central refinery across all the 100 simuation runs.

+
waterSupply
+     .addColumn("num_harvesters"){
+        it["num_harvesters"].map<Int>{ it.toString()+ " harvesters"}
+     }
+    .plot(x = "time", y = "value", group="run", color="num_harvesters")
+    .geomLine( alpha = .1)
+    .facetWrap("num_harvesters", scales=FacetScales.free_y)
+    .guides(color=LegendType.none)
+
+

jpeg

+

With more ice harvesters working around the base, supply of water is ensured. Initially there is a phase, were no deposits are yet discovererd, so the base is under a severe risk of running dry. To assess how often this happens, we count the number of runs per harvester where the base's refinery was depleted.

+
sims.map { sim ->
+    ("h "+sim.harvesters.size) to
+            sim.base.refinery.levelTimeline.statistics().min
+}.plot(x={ first}, fill={second==0.0})
+    .geomBar()
+    .labs(x="# harvesters", y="# simulation runs", fill = "Base Depleted?")
+
+

jpeg

+

As shown in the figure, it turns out, that with >=5 ice harvestering robots, the risk of water supply depletion at the base station is within an acceptable range.

+

We have just analyzed our lunar mining model using controlled randomization, and have performed a basic capacity analysis.

+

Exercise: Maintenance Module

+

The model could be extended to model robot health as well

+
    +
  • Occasional meteoroids hits will affect the harvester health status (with the varying amount, and which eventually will lead to robot outage)
  • +
  • Harvesters health is slowly decreasing while depleting deposits
  • +
  • Harvesters can be repaired in a special maintenance depot (which is a bit far off), so they must sure to get their in time because picking up broken robots in the field is very time consumin & expensive
  • +
+

Summary

+

ESPA is relieved. The simulation model showed that sufficient water-supplies can be gathered with 5 mining robots. The astronauts can even take a shower every Sunday from now on.

+

Using a discrete event simulation model built with kalasim, we have animated the process and have analyzed its statistical properties.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/animation/lunar_mining_files/lunar_mining_10_0.jpg b/animation/lunar_mining_files/lunar_mining_10_0.jpg new file mode 100644 index 00000000..e03f49b8 Binary files /dev/null and b/animation/lunar_mining_files/lunar_mining_10_0.jpg differ diff --git a/animation/lunar_mining_files/lunar_mining_12_0.jpg b/animation/lunar_mining_files/lunar_mining_12_0.jpg new file mode 100644 index 00000000..16f96199 Binary files /dev/null and b/animation/lunar_mining_files/lunar_mining_12_0.jpg differ diff --git a/animation/lunar_mining_files/lunar_mining_domain_model.png b/animation/lunar_mining_files/lunar_mining_domain_model.png new file mode 100644 index 00000000..063233bc Binary files /dev/null and b/animation/lunar_mining_files/lunar_mining_domain_model.png differ diff --git a/articles/2021-11-27-kalasim-v07/index.html b/articles/2021-11-27-kalasim-v07/index.html new file mode 100644 index 00000000..d3ab69bd --- /dev/null +++ b/articles/2021-11-27-kalasim-v07/index.html @@ -0,0 +1,1963 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kalasim v0.7 - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Kalasim v0.7

+ +

After quite some months of exploration, API refinements, countless simulations, and some literature research, we present with great pleasure the next milestone release of kalasim!

+

kalasim v0.7 is not just for engineers, but for process analysts and industrial engineers who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases. So, we deliberately took some time with this release to gather and analyze feedback from our users.

+

With this milestone release, we have stabilized the core API considerably, improved its performance dramatically while adding new features all over the place.

+

New Features

+

Major enhancements in this release are

+
    +
  • Added processRepeated to streamline modelling of reiterating processes
  • +
  • Reworked event & metrics logging API for better configurability and performance
  • +
  • Introduced ComponentList to provide metrics-enhanced collection similar to the existing ComponentQueue
  • +
  • Implemented ticks metrics monitor to streamline simulation monitoring
  • +
  • Added new timeline and activity log attributes to resources for streamlined utilization analytics
  • +
  • Extended display() support API on all major components and their collections (including Resource, Component or List<Component>, MetricTimeline)
  • +
  • Enabled simplified simulation parallelism by changing the dependency context registry to become thread-local
  • +
  • Dramatically improved simulation performance to scale at ease to thousands of simulation entities
  • +
+

See kalasim's changlog for a complete list of technical changes in the v0.7 milestone release

+

Documentation Improvements

+

We've rewritten a large part of the documentation for better readability. In particular, we've focussed on resources and components, which are the key elements of every business process model. A new chapter about collections was added, and the numerous advanced topics were worked out to cover more aspects of the product in much more detail.

+

Several new examples were added including the famous Bridge Games. The ATM was rebuilt using a jupyter-notebook example to better illustrate parallelization and the new visualization support API. Finally, we started a new larger scale example simulation to model the interplay of processes in an emergency room.

+

Acknowledgments

+

Different individuals and organizations made this milestone release possible. Most importantly, we'd like to thank SYSTEMA GmbH for supporting the project. Special thanks go to Ilya Muradyan and Igor Alshannikov from JetBrains for their patience with us and their wonderful support with Kotlin data-science tooling. We like to thank Arnaud Giuliani for providing great koin support and guidance, which is the basement on which we managed to build kalasim.

+

Finally, we'd like to thank the wonderful folks at CASUS for providing us the opportunity to introduce kalasim to a great simulation experts panel.

+

Next steps

+

We're having a packed feature roadmap. On the top of our roadmap are the following ideas

+
    +
  • Environment snapshotting & branching: This feature will dramatically ease distributed simulations, prepare for new types of AI connectivity, and will enable confidence bands for projects after user-defined branching events
  • +
  • Environment merging: We strive to enable algebraic composability of simulation environments
  • +
  • Better examples: Existing examples are intentionally kept small to illustrate the API. Next, we plan to release some large simulations with thousands of simulation entities, along with protocols on how to analyze dynamics in such systems
  • +
  • Adopt new Kotlin v1.6 language features such as the new duration API, simplified suspend method semantics, and builder inference improvements
  • +
+

Please note, that the kalasim APIs will be subject to breaking changes until a very distant major release.

+

If you think that kalasim is missing some important feature, please just let us know.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/articles/2022-09-27-kalasim-v08/index.html b/articles/2022-09-27-kalasim-v08/index.html new file mode 100644 index 00000000..f3ecf341 --- /dev/null +++ b/articles/2022-09-27-kalasim-v08/index.html @@ -0,0 +1,1988 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kalasim v0.8 - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Kalasim v0.8

+ +

After some more months of continued refinements, extensions and refactorings, and - for sure - a sightly number of new simulations across different domains and industries, we present with great pleasure the next milestone v0.8 release of kalasim!

+

kalasim v0.8 has matured considerable across the entire API. From a small experimental API it has grown into a battle-tested real-time scalable open-architecture simulation engine, designed not just for engineers, but for business process analysts and industrial engineers who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases.

+

New Features

+

With this milestone release, we have further stabilized its core API, improved its performance while adding new features all over the place.

+

Major enhancements in this release are

+
    +
  • Support for kotlin.time.Duration across the entire API. Processes can be expressed much more naturally using time-units:
  • +
+
val sim = createSimulation {
+    object : Component() {
+        override fun process() = sequence {
+            hold(3.days)
+            // some action
+            hold(2.minutes)
+        }
+    }
+}
+
+sim.run(3.years)
+
+
    +
  • +

    Added new options to model resource honor policies allowing for more configurable request queue consumption +

    val r  = Resource(honorPolicy = RequestHonorPolicy.StrictFCFS)
    +

    +
  • +
  • +

    Added Timeline Arithmetics. It is now possible to perform stream arithmetics on timeline attributes

    +
  • +
  • We have reworked and simplified depletable resources. This enables a wide range of new use-cases. See lunar mining for a great example. As part of this feature, we have introduced different request modes to model resources requests that exceed resource capacity. +
    val tank  = DepletableResource(capacity=100, initialLevel=60)
    +
    +put(gasSupply, 50, capacityLimitMode = CapacityLimitMode.CAP)
    +
  • +
  • A new animation submodule to visualize process simulations was added. To keep the core API minimalistic, a new dependency adds all required dependencies from OpenRendr. This additional dependency also provides complimentary utilities such as AnimationComponent to streamline rendering. To demonstrate the capabilities, we have worked out several examples such as the moon base and the office tower.
  • +
+

Other notable enhancements in this release are a streamlined predicate consumption in wait(), more supported statistical distributions, improved bottleneck analysis using resource request-ids and RequestScopeContext in honor block. First community PRs were merged, in particular +#35 which improved the support for asynchronous event consumption.

+

For a complete list of technical changes in the v0.8 milestone release check out our change log.

+

Example & Documentation Improvements

+

Several new examples were added as part of this release. First, we explored resource mining on the moon, where we don't just demonstrate how to model a complex mining and logistics operation, but also showcase how to animate this process. In the office tower we explore capacity planning via an interactive UI to size elevators in a busy office building.

+

Acknowledgments

+

Different individuals and organizations made this milestone release possible. Most importantly, we'd like to thank SYSTEMA GmbH for supporting the project.

+

Next steps

+

While improving kalasim, we have dropped some roadmap items sketched out earlier.

+
    +
  • Environment snapshotting & branching: While we still believe that this would be highly beneficial, the feature is currently blocked by issues with serialization of kotlin objects (in particular coroutines)
  • +
  • We have evaluated but eventually dropped the idea of algebraic composability of simulation environments. Mainly because instances of org.kalasim.Environment can be configured to be incompatible on various levels which can't be resolved with a simple +
  • +
+

Next on our roadmap are various open tickets as well as the following meta-tasks

+
    +
  • The next release is likely to enforce a tick-duration (seconds, hours, etc.) for any simulation. Along with that, to improve the type-safety and readability of process definitions, we will start replacing all - essentially untyped - tick-time duration method arguments with kotlin.time.Duration equivalents.
  • +
  • Better examples & better teaching materials: We will continue to release more complex simulations with thousands of simulation entities (in particular finishing the emergency room), along with protocols on how to analyze and optimize dynamics in such systems.
  • +
  • Improved kotlin-jupyter integration to bring more control and introspection functions into the browser.
  • +
+

Please note, that the kalasim APIs will be subject to breaking changes until a first major release.

+

If you think that kalasim is missing some important feature, please just let us know.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/articles/2022-11-25-kalasim-at-wsc22/index.html b/articles/2022-11-25-kalasim-at-wsc22/index.html new file mode 100644 index 00000000..d1d27640 --- /dev/null +++ b/articles/2022-11-25-kalasim-at-wsc22/index.html @@ -0,0 +1,1828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WSC22 - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

WSC22

+ +

kalasim will be very present this year at the Winter Simulation Conference 2022 (Singapore, December 11-14, 2022). Feel welcome to reach out to us at the conference to discuss about simulation, kalasim, process analytics & optimization, or kotlin for data science. We are also ready - and eager - to support you with your simulations written in kalasim at the conference. We intentionally do not have a physical booth - our booth will just be where we meet you!

+

wsc

+

As part of the research initiative AISSI, where various partners from industry and academy develop, integrate and apply novel AI-based approaches to bring scheduling to a new level, we have modelled a complex production process with kalasim. By applying reinforcement learning in a framework for autonomous, integrated production and maintenance scheduling, we strive to outperform classical planning methods wrt critical KPIs such as throughput or due date adherence.

+

As part of the Modeling and Simulation of Semiconductor Manufactoring track, we - Holger Brandl (lead dev of kalasim), Philipp Rossbach, and Hajo Terbrack from SYSTEMA GmbH and Tobias Sprogies from NEXPERIA Germany GmbH) - will proudly present our analysis of a complex manufacturing process simulation implemented with kalasim.

+
+

Maximizing Throughput, Due Date Compliance and Other Partially Conflicting Objectives Using Multifactorial AI-powered Optimization

+
+

For the abstract see here

+

kalasim has grown very quickly from small experimental API into a battle-tested real-time scalable open-architecture next-generation code-first simulation engine, designed not just for engineers, but for business process analysts and industrial engineers who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases.

+

If you want to get started with kalasim, need support, or if you think that some important feature is yet missing, feel welcome to get in touch.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/articles/articles/index.html b/articles/articles/index.html new file mode 100644 index 00000000..6a0afce3 --- /dev/null +++ b/articles/articles/index.html @@ -0,0 +1,1829 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Overview - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Articles

+

follow us in feedly Download

+

News, articles, and tutorials centering simulation best practices, success stories from industries, and technical deep dives.

+

We've just started this section, so please be a bit patient in here :-)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000..1cf13b9f Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.83f73b43.min.js b/assets/javascripts/bundle.83f73b43.min.js new file mode 100644 index 00000000..43d8b70f --- /dev/null +++ b/assets/javascripts/bundle.83f73b43.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Wi=Object.create;var gr=Object.defineProperty;var Di=Object.getOwnPropertyDescriptor;var Vi=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,Ni=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,ao=Object.prototype.propertyIsEnumerable;var io=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&io(e,r,t[r]);if(Vt)for(var r of Vt(t))ao.call(t,r)&&io(e,r,t[r]);return e};var so=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&ao.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var zi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Vi(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Di(t,n))||o.enumerable});return e};var Mt=(e,t,r)=>(r=e!=null?Wi(Ni(e)):{},zi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var co=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var lo=xr((Er,po)=>{(function(e,t){typeof Er=="object"&&typeof po!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function L(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function te(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,te())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",L,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=xr((hy,On)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var $a=/["'&<>]/;On.exports=Pa;function Pa(e){var t=""+e,r=$a.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return Ui}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(A){return!1}}var d=function(A){var M=f()(A);return u("cut"),M},y=d;function L(V){var A=document.documentElement.getAttribute("dir")==="rtl",M=document.createElement("textarea");M.style.fontSize="12pt",M.style.border="0",M.style.padding="0",M.style.margin="0",M.style.position="absolute",M.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return M.style.top="".concat(F,"px"),M.setAttribute("readonly",""),M.value=V,M}var X=function(A,M){var F=L(A);M.container.appendChild(F);var D=f()(F);return u("copy"),F.remove(),D},te=function(A){var M=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,M):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,M):(F=f()(A),u("copy")),F},J=te;function k(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(M){return typeof M}:k=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},k(V)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},M=A.action,F=M===void 0?"copy":M,D=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:D});if(Y)return F==="cut"?y(Y):J(Y,{container:D})},qe=ft;function Fe(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(M){return typeof M}:Fe=function(M){return M&&typeof Symbol=="function"&&M.constructor===Symbol&&M!==Symbol.prototype?"symbol":typeof M},Fe(V)}function ki(V,A){if(!(V instanceof A))throw new TypeError("Cannot call a class as a function")}function no(V,A){for(var M=0;M0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Fe(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,$e=this.action(Y)||"copy",Dt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Dt?"success":"error",{action:$e,text:Dt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return y(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,$e=!!document.queryCommandSupported;return Y.forEach(function(Dt){$e=$e&&!!document.queryCommandSupported(Dt)}),$e}}]),M}(s()),Ui=Fi},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,y){var L=c.apply(this,arguments);return l.addEventListener(u,L,y),{destroy:function(){l.removeEventListener(u,L,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(L){return s(L,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(L){L.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(L){L.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,L)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(L){u(i[0][3],L)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function uo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var Ue=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(L){t={error:L}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(L){i=L instanceof zt?L.errors:[L]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{ho(y)}catch(L){i=i!=null?i:[],L instanceof zt?i=q(q([],N(i)),N(L.errors)):i.push(L)}}}catch(L){o={error:L}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)ho(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=Ue.EMPTY;function qt(e){return e instanceof Ue||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function ho(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new Ue(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new To(r,o)},t}(j);var To=function(e){oe(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Lo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(yt);var kr=new Lo(Oo);var Mo=function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var _o=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(yt);var me=new _o(Mo);var S=new j(function(e){return e.complete()});function Yt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Yt(Hr(e))?e.pop():void 0}function Bt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return H(e==null?void 0:e.then)}function Jt(e){return H(e[bt])}function Xt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Zi(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Zi();function tr(e){return H(e==null?void 0:e[er])}function rr(e){return fo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return H(e==null?void 0:e.getReader)}function U(e){if(e instanceof j)return e;if(e!=null){if(Jt(e))return ea(e);if(xt(e))return ta(e);if(Gt(e))return ra(e);if(Xt(e))return Ao(e);if(tr(e))return oa(e);if(or(e))return na(e)}throw Zt(e)}function ea(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function ta(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?De(t):Qo(function(){return new ir}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,L=!1,X=function(){f==null||f.unsubscribe(),f=void 0},te=function(){X(),l=u=void 0,y=L=!1},J=function(){var k=l;te(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!L&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!L&&!y&&(f=Ur(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){L=!0,X(),f=Ur(te,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Ur(te,a),qe.complete()}}),U(k).subscribe(l))})(c)}}function Ur(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var wa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return wa.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Le(+!r*t)):le,Q(e.matches(":hover"))))}function Jo(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Jo(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Jo(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Xo=new g,Ta=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Xo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ta.pipe(w(r=>r.observe(t)),v(r=>Xo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Zo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ve(e){return{x:e.offsetLeft,y:e.offsetTop}}function en(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function tn(e){return O(h(window,"load"),h(window,"resize")).pipe(Me(0,me),m(()=>Ve(e)),Q(Ve(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Me(0,me),m(()=>pr(e)),Q(pr(e)))}var rn=new g,Sa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)rn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return Sa.pipe(w(t=>t.observe(e)),v(t=>rn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function on(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function nn(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Oa(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function La(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function an(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:nn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Oa(o,r)}return!0}),pe());return La().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function sn(){return new g}function cn(){return location.hash.slice(1)}function pn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Ma(e){return O(h(window,"hashchange"),e).pipe(m(cn),Q(cn()),b(t=>t.length>0),G(1))}function ln(e){return Ma(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function mn(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function un(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function dn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function hn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(dn),Q(dn()))}function bn(){return{width:innerWidth,height:innerHeight}}function vn(){return h(window,"resize",{passive:!0}).pipe(m(bn),Q(bn()))}function gn(){return z([hn(),vn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=z([o,r]).pipe(m(()=>Ve(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function _a(e){return h(e,"message",t=>t.data)}function Aa(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function yn(e,t=new Worker(e)){let r=_a(t),o=Aa(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(W(i))),pe())}var Ca=R("#__config"),Ot=JSON.parse(Ca.textContent);Ot.base=`${new URL(Ot.base,ye())}`;function xe(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function ka(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function xn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),ka(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ha(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function En(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ha(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Tn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Sn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var Ln=Mt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,Ln.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function _n(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function An(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Ra(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Cn(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Ra)))}var Ia=0;function ja(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Zo(e)).pipe(ne(Ne),pt(1),He(t),m(()=>en(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Fa(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Ia++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(Ht(c=>Le(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),ja(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Fa(e,{content$:new j(o=>{let n=e.title,i=wn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function Ua(e,t){let r=C(()=>z([tn(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function kn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(W(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Me(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(W(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(W(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),Ua(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Wa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Da(e){let t=[];for(let r of Wa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function Hn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Da(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,Tn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?Hn(f,u):Hn(u,f)}),O(...[...a].map(([,l])=>kn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function $n(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return $n(t)}}function Pn(e,t){return C(()=>{let r=$n(e);return typeof r!="undefined"?fr(r,e,t):S})}var Rn=Mt(Br());var Va=0;function In(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return In(t)}}function Na(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),ee("scrollable"))}function jn(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Rn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Va++}`;let l=Sn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=In(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(W(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Na(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function za(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Fn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),za(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Un=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,Qa=0;function Ka(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=Ka().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Un,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>co(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${Qa++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Dn=x("table");function Vn(e){return e.replaceWith(Dn),Dn.replaceWith(An(e)),I({ref:e})}function Ya(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Nn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));z([s,ge(e),tt(e)]).pipe(W(p),Me(1,me)).subscribe({next([{active:c},l]){let f=Ve(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(W(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(W(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(W(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let L of P(":scope > input",y)){let X=R(`label[for="${L.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),L.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(W(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Ya(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function zn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>Pn(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>jn(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Vn(n)),...P("details",e).map(n=>Fn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Nn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ba(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function qn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ba(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ga=0;function Ja(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ve(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function Qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ga++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Me(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ja(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Xa({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Kn(e,t){return C(()=>z([ge(e),Xa(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Yn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(ee("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>Qn(a)));return r.subscribe(o),t.pipe(W(n),m(a=>$({ref:e},a)),Re(i.pipe(W(n))))})}function Za(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),ee("active"))}function Bn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Za(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Gn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function es(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Jn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),es(t).pipe(W(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Xn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Mt(Br());function ts(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Zn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||ts(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function ei(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function rs(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[ei(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(ei(new URL(s),t))}}return r}function ur(e){return un(new URL("sitemap.xml",e)).pipe(m(t=>rs(t,new URL(e))),de(()=>I(new Map)))}function os(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ti(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ri(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function ns(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ti(document);for(let[o,n]of ti(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return We(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function oi({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ri);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>os(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(ee("pathname"),v(p=>fn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ri),v(ns),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),ee("pathname"),v(()=>e),ee("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",pn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(ee("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var ni=Mt(qr());function ii(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,ni.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function jt(e){return e.type===1}function dr(e){return e.type===3}function ai(e,t){let r=yn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function si(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=Xr(n))==null?void 0:l.pathname;if(i===void 0)return;let a=ss(o.pathname,i);if(a===void 0)return;let s=ps(t.keys());if(!t.has(s))return;let p=Xr(a,s);if(!p||!t.has(p.href))return;let c=Xr(a,r);if(c)return c.hash=o.hash,c.search=o.search,c}function Xr(e,t){try{return new URL(e,t)}catch(r){return}}function ss(e,t){if(e.startsWith(t))return e.slice(t.length)}function cs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oS)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(new URL(p)))}}return S}),v(i=>ur(i).pipe(m(a=>{var s;return(s=si({selectedVersionSitemap:a,selectedVersionBaseURL:i,currentLocation:ye(),currentBaseURL:t.base}))!=null?s:i})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(Cn(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function ls(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(jt)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function pi(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));z([t.pipe(Ae(jt)),r],(i,a)=>a).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ls(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function li(e,{worker$:t,query$:r}){let o=new g,n=on(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(re(r),Wr(t.pipe(Ae(jt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Vr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function ms(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function mi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),ms(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function fi(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function ui(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ai(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=pi(i,{worker$:n});return O(s,li(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>mi(p,{query$:s})),...ae("search-suggest",e).map(p=>fi(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function di(e,{index$:t,location$:r}){return z([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ii(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function fs(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Zr(e,o){var n=o,{header$:t}=n,r=so(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=Ve(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Me(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),W(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),fs(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function hi(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),De({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),De({}))}}function bi(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),De({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}function vi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return hi(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return bi(r,o)}return S}var us;function ds(e){return us||(us=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return vi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function gi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(_n(o)),t.classList.add("md-source__repository--active")}),ds(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function hs(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function yi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):hs(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function bs(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(ee("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(ee("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,L]=f[0];if(L-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(W(a),ee("offset"),_e(250),Ce(1),W(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),bs(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function vs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),W(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function Ei(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(a),ee("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),vs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function wi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(W(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(W(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ti({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function gs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Si({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(gs),ne(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Oi({viewport$:e,tablet$:t}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ys(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",eo.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",eo.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Go(),Ut=sn(),Lt=ln(Ut),to=an(),Oe=gn(),hr=Pt("(min-width: 960px)"),Mi=Pt("(min-width: 1220px)"),_i=mn(),eo=xe(),Ai=document.forms.namedItem("search")?ys():Ye,ro=new g;Zn({alert$:ro});var oo=new g;B("navigation.instant")&&oi({location$:Ut,viewport$:Oe,progress$:oo}).subscribe(ot);var Li;((Li=eo.version)==null?void 0:Li.provider)==="mike"&&ci({document$:ot});O(Ut,Lt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});to.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});wi({viewport$:Oe,document$:ot});Ti({document$:ot,tablet$:hr});Si({document$:ot});Oi({viewport$:Oe,tablet$:hr});var rt=Kn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Gn(e,{viewport$:Oe,header$:rt})),G(1)),xs=O(...ae("consent").map(e=>En(e,{target$:Lt})),...ae("dialog").map(e=>qn(e,{alert$:ro})),...ae("palette").map(e=>Jn(e)),...ae("progress").map(e=>Xn(e,{progress$:oo})),...ae("search").map(e=>ui(e,{index$:Ai,keyboard$:to})),...ae("source").map(e=>gi(e))),Es=C(()=>O(...ae("announce").map(e=>xn(e)),...ae("content").map(e=>zn(e,{viewport$:Oe,target$:Lt,print$:_i})),...ae("content").map(e=>B("search.highlight")?di(e,{index$:Ai,location$:Ut}):S),...ae("header").map(e=>Yn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("header-title").map(e=>Bn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Mi,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Zr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>yi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>xi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})),...ae("top").map(e=>Ei(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Lt})))),Ci=ot.pipe(v(()=>Es),Re(xs),G(1));Ci.subscribe();window.document$=ot;window.location$=Ut;window.target$=Lt;window.keyboard$=to;window.viewport$=Oe;window.tablet$=hr;window.screen$=Mi;window.print$=_i;window.alert$=ro;window.progress$=oo;window.component$=Ci;})(); +//# sourceMappingURL=bundle.83f73b43.min.js.map + diff --git a/assets/javascripts/bundle.83f73b43.min.js.map b/assets/javascripts/bundle.83f73b43.min.js.map new file mode 100644 index 00000000..fe920b7d --- /dev/null +++ b/assets/javascripts/bundle.83f73b43.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/office_tower_model.svg b/examples/office_tower_model.svg new file mode 100644 index 00000000..3f67e880 --- /dev/null +++ b/examples/office_tower_model.svg @@ -0,0 +1,1273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sequence + < + Component + > + + + + + + + + + + + process + ( + ) + + + + + + String + + + + + + + + + + + toString + ( + ) + + + + + + + + + + + + Floor + + + + + + + + + + + toFloor + + + + + + Int + + + + + + + + + + + to + + + + + + Int + + + + + + + + + + + from + + + + + + Direction + + + + + + + + + + + direction + + + + + + Elevator + + + + + + + + + + + elevator + + + + + + Floor + + + + + + + + + + + fromFloor + + + + + + + + + + + + + + + Visitor + + + + + + + + + + + + + + + String + + + + + + + + + + + toString + ( + ) + + + + + + + + + + + + ComponentQueue + < + Visitor + > + + + + + + + + + + + queue + + + + + + Int + + + + + + + + + + + level + + + + + + + + + + + + + + + Floor + + + + + + + + + + + + + + + Unit + + + + + + + + + + + + suspend + + closeDoor + ( + SequenceScope + < + Component + > + ) + + + + + + Sequence + < + Component + > + + + + + + + + + + + process + ( + ) + + + + + + Unit + + + + + + + + + + + + suspend + + openDoor + ( + SequenceScope + < + Component + > + ) + + + + + + + + + + + + ComponentQueue + < + Visitor + > + + + + + + + + + + + visitors + + + + + + Floor + + + + + + + + + + + floor + + + + + + Direction + + + + + + + + + + + direction + + + + + + DoorState + + + + + + + + + + + door + + + + + + Int + + + + + + + + + + + capacity + + + + + + + + + + + + + + + Car + + + + + + + + + + + + + + + Sequence + < + Component + > + + + + + + + + + + + process + ( + ) + + + + + + + + + + + + Iterator + < + Pair + < + Int + , + Int + > + > + + + + + + + + + + + fromTo + + + + + + Pair + < + Int + , + Int + > + + + + + + + + + + + toRange + + + + + + Int + + + + + + + + + + + load + + + + + + Pair + < + Int + , + Int + > + + + + + + + + + + + fromRange + + + + + + + + + + + + + + + VisitorGenerator + + + + + + + + + + + + + + + Direction + + + + + + + + + + + + invert + ( + ) + + + + + + Int + + + + + + + + + + + + asIncrement + ( + ) + + + + + + + + + + + + + + + Direction + + + + + + + + + + + + + + + List + < + Floor + > + + + + + + + + + + + floors + + + + + + Map + < + Pair + < + Floor + , + Direction + > + , + TickTime + > + + + + + + + + + + + requests + + + + + + List + < + Car + > + + + + + + + + + + + cars + + + + + + + + + + + + + + + Elevator + + + + + + + + + + + + + + + «create» + + + + + + + + + + + 1 + 1 + + + + + + + + + 1 + 1 + + + + + + + + + + + + + + + + * + 1 + + + + + + + + + + «create» + + + + + + + + + + + + «create» + + + + + + + + + + + 1 + 1 + + + + + + + + + + + + + + + + * + 1 + + + + + + + + + + + + + + + + + «create» + + + + + + + + + + + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + 1 + 1 + + + diff --git a/examples/office_tower_snapshot.jpg b/examples/office_tower_snapshot.jpg new file mode 100644 index 00000000..74b231b4 Binary files /dev/null and b/examples/office_tower_snapshot.jpg differ diff --git a/examples/philosophers.png b/examples/philosophers.png new file mode 100644 index 00000000..2418c923 Binary files /dev/null and b/examples/philosophers.png differ diff --git a/examples/shipyard/bom_example/index.html b/examples/shipyard/bom_example/index.html new file mode 100644 index 00000000..57b7923b --- /dev/null +++ b/examples/shipyard/bom_example/index.html @@ -0,0 +1,1842 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Bom example - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Bom example

+ +

Hull Components:

+

1.Steel Plates (Quantity: 20)

+

2.Bulkheads (Quantity: 5)

+

3.Frames (Quantity: 15)

+

4.Keel (Quantity: 1)

+

Engines:

+

1.Main Engine (Quantity: 2)

+

2.Auxiliary Engines (Quantity: 3)

+

Electrical Systems:

+
    +
  • Generators:
  • +
+

1.Diesel Generators (Quantity: 2)

+

2.Emergency Generator (Quantity: 1)

+
    +
  • Cabling and Wiring:
  • +
+

1.Electrical Cables (Quantity: 500 meters)

+

2.Wiring Harnesses (Quantity: 50)

+
    +
  • Switchgear:
  • +
+

1.Circuit Breakers (Quantity: 30)

+

2.Switch Panels (Quantity: 10)

+

Navigation Equipment:

+

1.Radar Systems (Quantity: 2)

+

2.GPS Navigation Units (Quantity: 1)

+

3.Compass (Quantity: 1)

+

Safety Equipment:

+

1.Lifeboats (Quantity: 4)

+

2.Life Jackets (Quantity: 50)

+

3.Fire Extinguishers (Quantity: 10)

+

Interior Fixtures:

+

1.Cabin Furniture (Quantity: 10 sets)

+

2.Galley Equipment (Quantity: 1 set)

+

Deck Machinery:

+

1.Cranes (Quantity: 2)

+

2.Winches (Quantity: 4)

+

Miscellaneous:

+

1.Paint (Quantity: 50 gallons)

+

2.Nuts, Bolts, and Fasteners (Quantity: Assorted)

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/shipyard/shipyard/index.html b/examples/shipyard/shipyard/index.html new file mode 100644 index 00000000..a50fa18f --- /dev/null +++ b/examples/shipyard/shipyard/index.html @@ -0,0 +1,1882 @@ + + + + + + + + + + + + + + + + + + + + + + + + + Bill of Materials (BOM) in Ship Final Assembly: A Key Component of Efficient Production - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Bill of Materials (BOM) in Ship Final Assembly: A Key Component of Efficient Production

+

Introduction

+

The production process of complex structures such as ships involves meticulous planning, precision, and coordination of various components and materials. A crucial tool in this process is the Bill of Materials (BOM), which serves as a comprehensive document that outlines the list of components, materials, and parts required for the final assembly of a ship. In this article, we will explore how BOMs are used in ship final assembly, highlighting their importance in ensuring a smooth and efficient production process.

+

What is a Bill of Materials (BOM)?

+

A Bill of Materials (BOM) is a structured list of all the items, components, and materials necessary to manufacture a product or assemble a final product, like a ship. It details each part's name, quantity, specifications, and the relationship between them. BOMs are crucial for coordinating various aspects of production, from sourcing materials to managing inventory and tracking costs.

+

The Role of BOMs in Ship Final Assembly

+

Inventory Management: BOMs help shipbuilders keep track of all the components needed for assembly. This allows for efficient inventory management, ensuring that the right materials are available when needed, minimizing delays in production.

+

Quality Assurance: BOMs also include specifications and quality requirements for each component. This ensures that only the approved parts are used, reducing the likelihood of defects or safety issues in the final product.

+

Cost Estimation: By providing a detailed list of materials and components, BOMs are invaluable in cost estimation and budgeting. They allow shipbuilders to calculate the overall production costs accurately, ensuring that the project remains within budget.

+

Sourcing and Procurement: BOMs are used to create purchase orders for required materials and components. This helps streamline the procurement process, ensuring that the right parts are ordered in the correct quantities and from approved suppliers.

+

Assembly Planning: BOMs serve as a roadmap for the assembly process. They help in organizing the assembly line and ensuring that workers have access to the necessary components in the right order, reducing assembly time and improving efficiency.

+

Example: Ship Final Assembly

+

Let's consider the assembly of a cargo ship as an example. The ship's BOM would include a detailed list of all components, such as the hull, engines, electrical systems, navigation equipment, and more. Each of these components would have its own sub-BOMs, breaking down further into individual parts. For instance, the electrical system's sub-BOM might include cables, switches, and circuit boards, specifying the quantity, specifications, and suppliers for each.

+

By having a well-structured BOM for the cargo ship, the shipbuilder can ensure that all components are available on time, that quality standards are met, and that the assembly process is efficient. This not only reduces the production timeline but also increases the overall quality and safety of the final product.

+

How would a typical BOM in cargo ship final assembly look like

+

Conclusion

+

Bill of Materials (BOMs) are an essential tool in the production process, especially in the complex field of ship assembly. They provide a detailed and organized overview of the materials and components required for final assembly, allowing for efficient management of inventory, quality assurance, cost estimation, and assembly planning. In shipbuilding, BOMs play a crucial role in ensuring that the final product is not only completed on time but also meets the highest quality and safety standards.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/spaghetti_time.png b/examples/spaghetti_time.png new file mode 100644 index 00000000..e481650a Binary files /dev/null and b/examples/spaghetti_time.png differ diff --git a/examples/squid_game_bridge_scene.png b/examples/squid_game_bridge_scene.png new file mode 100644 index 00000000..86c3fd5b Binary files /dev/null and b/examples/squid_game_bridge_scene.png differ diff --git a/examples/squid_game_poster.png b/examples/squid_game_poster.png new file mode 100644 index 00000000..8960485c Binary files /dev/null and b/examples/squid_game_poster.png differ diff --git a/examples/traffic/index.html b/examples/traffic/index.html new file mode 100644 index 00000000..5cebeb58 --- /dev/null +++ b/examples/traffic/index.html @@ -0,0 +1,1906 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Traffic - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Traffic

+ + + +

The following example integrates three simulation entities

+
    +
  • A gas station with a limited number of pumps
  • +
  • A traffic light that prevents cars from driving
  • +
  • Multiple cars that need to pass the cross with the traffic light to reach a gas station. There each car needs to refill before it is reaching its end of live within the simulation context.
  • +
+

The example illustrates how to establish a simple interplay of states and resources. It is realized elegantly with dependency injection.

+
////Traffic.kts
+import org.kalasim.*
+import org.koin.core.component.inject
+
+enum class TrafficLightState { RED, GREEN }
+
+/** A traffic light with 2 states. */
+class TrafficLight : State<TrafficLightState>(TrafficLightState.RED) {
+
+    fun toggleState() {
+        when(value) {
+            TrafficLightState.RED -> TrafficLightState.GREEN
+            TrafficLightState.GREEN -> TrafficLightState.RED
+        }
+    }
+}
+
+
+/** A simple controller that will toggle the state of the traffic-light */
+class TrafficLightController(val trafficLight: TrafficLight) : Component() {
+
+    override fun repeatedProcess() = sequence {
+        hold(6)
+        trafficLight.toggleState()
+    }
+}
+
+/** A gas station, where cars will stop for refill. */
+class GasStation(numPumps: Int = 6) : Resource(capacity = numPumps)
+
+/** A car with a process definition detailing out its way to the gas-station via a crossing. */
+class Car(val trafficLight: TrafficLight) : Component() {
+
+    val gasStation by inject<GasStation>()
+
+    override fun process() = sequence {
+        // Wait until the traffic light is green
+        wait(trafficLight, TrafficLightState.GREEN)
+
+        // Request a slot in the gas-station
+        request(gasStation) {
+            hold(5, description = "refilling")
+        }
+    }
+}
+
+createSimulation {
+    enableComponentLogger()
+
+    // Add a traffic light so that we can refer to it via koin get<T>()
+    dependency { TrafficLight() }
+
+    // Also add a resource with a limited capacity
+    dependency { GasStation(2) }
+
+    // Setup a traffic light controller to toggle the light
+    TrafficLightController(get())
+
+    // Setup a car generator with an exponentially distributed arrival time
+    ComponentGenerator(exponential(7).minutes) { Car(get()) }
+
+    // enable component tracking for later analytics
+    val cg = componentCollector()
+
+    // Run for 30 ticks
+    run(10)
+
+    // Toggle the traffic light manually
+    get<TrafficLight>().value = TrafficLightState.GREEN
+
+    // Run for another 10 ticks
+    run(10)
+
+    // Assess the state of the simulation entities
+    cg.filterIsInstance<Car>().first().stateTimeline.printHistogram()
+    get<GasStation>().printStatistics()
+}
+
+

Here, we use both lazy injection with inject<T>() and instance retrieval with get<T>(). For details see koin reference

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/trafficlight.jpg b/examples/trafficlight.jpg new file mode 100644 index 00000000..f77b14b6 Binary files /dev/null and b/examples/trafficlight.jpg differ diff --git a/faq/index.html b/faq/index.html new file mode 100644 index 00000000..d79192b6 --- /dev/null +++ b/faq/index.html @@ -0,0 +1,1976 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + FAQ - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

F.A.Q.

+

Why rebuilding salabim?

+

Great question! Initial development was driven by curiosity about the salabim internals. Also, it lacked (arguably) a modern API touch which made some of our use cases more tricky to implement.

+

kalasim implements all major features of salabim as documented under https://www.salabim.org/manual/.

+

What (TF) is the meaning of kalasim?

+

We went through multiple iterations to come up with this great name:

+
    +
  1. desimuk - {d}iscrete {e}vent {simu}lation with {k}otlin seemed a very natural and great fit. Unfortunately, Google seemed more convinced - for reasons that were outside the scope of this project - that this name related mostly with indian porn.
  2. +
  3. desim - seemed fine initially, until we discovered another simulation engine https://github.com/aybabtme/desim with the same name.
  4. +
  5. kalasim honors its origin by being somewhat phonetically similar to salabim while stressing Kotlin with the k, and the simulation scope with the sim instead of the bim.
  6. +
+

In case you also wonder why salabim was named salabim, see here.

+

Can we use it with from Java?

+

Kotlin-2-Java interop is a core design goal of Kotlin. Thus, kalasim should work without any issues from java. However, we have not tried yet, so in case you struggle please file a ticket.

+

Why can we use resource.request(1)?

+

Admittedly, the provided resource request syntax request(resource) feels a bit dated. It's designed in that way because we would need multiple receiver support for extensions functions to provide a more object-oriented API. However, extensions with multiple receivers are not (yet) supported by Kotlin.

+

How to fix Simulation environment context is missing error?

+

You would need to create a simulation context before instantiating the resources, components or states. E.g. with

+
Environment().apply{
+    val devices = Resource(name = "devices", capacity = 3)
+}
+
+

For more details regarding koin and dependency injection see https://www.kalasim.org/basics/#dependency-injection

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/getting_started/index.html b/getting_started/index.html new file mode 100644 index 00000000..987d7a3c --- /dev/null +++ b/getting_started/index.html @@ -0,0 +1,1845 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Getting Started - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

How to get started with kalasim?

+

Depending on your prior experience with simulation and programming, it may take time to become fluent with kalasim.

+

To streamline the learning experience, we've organized our learning process suggestions by audience.

+

I have experience with simulation

+
    +
  1. Start by doing a crash course to learn some kotlin programming basics
  2. +
  3. Run the provided simulation examples Simple Traffic and Extended Traffic in your browser (powered by datalore)
  4. +
  5. Pick your favorite example and try converting it into a datalore notebook
  6. +
  7. Try visualizing some metrics using the built-in visualization methods
  8. +
+

I have experience with programming

+
    +
  1. Download the community edition of Intellij IDEA
  2. +
  3. Follow the instructions to create a Kotlin application
  4. +
  5. Add kalasim as a dependency as described in the setup
  6. +
  7. Understand the fundamentals of simulation and the main simulation entities
  8. +
  9. Pick you favorite example and work it out towards your own interest/use-cases
  10. +
+

Get in touch

+

Feel welcome to get in touch with us for support, consulting and discussion.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..81d8a5bc --- /dev/null +++ b/index.html @@ -0,0 +1,2000 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Introduction - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Welcome to kalasim

+

Download Build Status slack +github-discussions

+

kalasim is a discrete event simulator. It provides a statically typed API, dependency injection, modern persistence, structured logging and automation capabilities.

+

kalasim is designed for simulation practitioners, process analysts and industrial engineers, who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases.

+

In contrast to many other simulation tools, kalasim is neither low-code nor no-code. It is code-first to enable change tracking, scaling, refactoring, CI/CD, unit-tests, and the rest of the gang that makes simulation development fun.

+

kalasim is written in Kotlin, is designed around suspendable coroutines for process definitions, runs on the JVM for performance and scale, is built with koin as dependency wiring framework, and is using common-math for stats and distributions. See acknowledgements for further references. kalasim is agnostic regarding a visualization frontend, but we provide bindings/examples using plotly.kt, lets-plot as well as kravis.

+
+
+

Meet kalasim at KotlinConf

+

We presented at KotlinConf 2023 in Amsterdam! We were there together with other technology leads from cloud, mobile & data-science for a great week of discussion and knowledge sharing. Our talk about "Make more money by modeling and optimizing your business processes with Kotlin" was well perceived and a lot of fun. Enjoy:

+
+
+ +
+ +
+

Core Features

+

kalasim is a generic process-oriented discrete event simulation (DES) engine.

+ +

Find out more about the basics of a kalasim simulation.

+

First Example

+

Let’s start with a very simple model. The example demonstrates the main mode of operation, the core API and the component process model implemented in kalasim. We want to build a simulation where a single car is driving around for a some time before stopping in front of a red traffic light.

+
////Cars.kts
+import org.kalasim.*
+import kotlin.time.Duration.Companion.hours
+import kotlin.time.Duration.Companion.minutes
+
+
+class Driver : Resource()
+class TrafficLight : State<String>("red")
+
+class Car : Component() {
+
+    val trafficLight = get<TrafficLight>()
+    val driver = get<Driver>()
+
+    override fun process() = sequence {
+        request(driver) {
+            hold(30.minutes, description = "driving")
+
+            wait(trafficLight, "green")
+        }
+    }
+}
+
+createSimulation {
+    enableComponentLogger()
+
+    dependency { TrafficLight() }
+    dependency { Driver() }
+
+    Car()
+}.run(5.hours)
+
+

Curious about an in-depth analysis of this example? It's your lucky day, see here.

+

How to contribute?

+

Feel welcome to post ideas and suggestions to the project tracker.

+

We always welcome pull requests. :-)

+

Support

+

Feel welcome to post questions and ideas in the project's discussion forum

+

Feel also invited to chat with us in the kotlinlang.slack.com in the #kalasim channel.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/jupyter_event_log.png b/jupyter_event_log.png new file mode 100644 index 00000000..f28b678b Binary files /dev/null and b/jupyter_event_log.png differ diff --git a/monitors/index.html b/monitors/index.html new file mode 100644 index 00000000..e56f984f --- /dev/null +++ b/monitors/index.html @@ -0,0 +1,2220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Monitors - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Monitors

+

Monitors are a built-in mechanism of kalasim to collect data from a simulation. Monitors collect metrics automatically for resources, components, states and collections. On top of that the user can define her own monitors.

+

Monitors allow to capture and visualize the dynamics of a simulation model. There are two types of monitors:

+
    +
  • Level monitors are useful to collect data about a variable that keeps its value over a certain length + of time, such as the length of a queue or the color of a traffic light.
  • +
  • Value monitors are useful to collect distributional statistics without a time-dimension. Examples, are the length of stay in a queue, or the number of processing steps of a part.
  • +
+

For both types, the time is always collected, along with the value.

+

Monitors support a wide range of statistical properties via m.statistics() including

+
    +
  • mean
  • +
  • median
  • +
  • percentiles
  • +
  • min and max
  • +
  • standard deviation
  • +
  • histograms
  • +
+

For all these statistics, it is possible to exclude zero entries, +e.g. m.statistics(statistics=true) returns the mean, excluding zero entries.

+

Monitors can be disabled with disable() by setting the boolean flag ``.

+
m.disable()  // disable monitoring
+
+m.reset()              // reenable statistics monitoring
+m.reset(initialValue)   // reenable level monitoring
+
+

Continuation of a temporarily disabled monitor is currently not supported.

+

Value Monitors

+

Non-level monitors collects values which do not reflect a level, e.g. the processing time of a part.

+

There are 2 implementations to support categorical and numerical attributes

+
    +
  • org.kalasim.NumericStatisticMonitor
  • +
  • org.kalasim.FrequencyMonitor
  • +
+

Besides, it is possible to get all collected values as list with m.statistics().values.

+

Calling m.reset() will clear all collected values.

+

Level Monitors

+

Level monitors tally levels along with the current (simulation) time. E.g. the number of parts a machine is working on.

+

There are 2 implementations to support categorical and numerical attributes

+
    +
  • org.kalasim.CategoryTimeline
  • +
  • org.kalasim.MetricTimeline
  • +
+

Level monitors allow to query the value at a specific time +

val nlm = MetricTimeline()
+// ... collecting some data ...
+nlm[4]  // will query the value at time 4
+
+nlm[now] // will query the current value 
+

+

In addition to standard statistics, level monitors support the following statistics

+
    +
  • duration
  • +
+

For all statistics, it is possible to exclude zero entries, e.g. m.statistics(excludeZeros=true).mean returns the mean, excluding zero entries.

+ + + + + + + + + + + + +

Calling m.reset() will clear all tallied values and timestamps.

+

The statistics of a level monitor can be printed with m.printStatistics().

+

Histograms

+

The statistics of a monitor can be printed with printStatistics(). +E.g: waitingLine.lengthOfStayMonitor.printStatistics():

+
{
+    "all": {
+      "entries": 5,
+      "ninety_pct_quantile": 4.142020545932034,
+      "median": 1.836,
+      "mean": 1.211,
+      "ninetyfive_pct_quantile": 4.142020545932034,
+      "standard_deviation": 1.836
+    },
+    "excl_zeros": {
+      "entries": 2,
+      "ninety_pct_quantile": 4.142020545932034,
+      "median": 1.576,
+      "mean": 3.027,
+      "ninetyfive_pct_quantile": 4.142020545932034,
+      "standard_deviation": 1.576
+    }
+}
+
+

And, a histogram can be printed with printHistogram(). E.g. +waitingLine.lengthOfStayMonitor.printHistogram():

+
Histogram of: 'Available quantity of fuel_pump'
+              bin | entries |  pct |                                         
+[146.45, 151.81]  |       1 |  .33 | *************                           
+[151.81, 157.16]  |       0 |  .00 |                                         
+[157.16, 162.52]  |       0 |  .00 |                                         
+[162.52, 167.87]  |       0 |  .00 |                                         
+[167.87, 173.23]  |       1 |  .33 | *************                           
+[173.23, 178.58]  |       0 |  .00 |                                         
+[178.58, 183.94]  |       0 |  .00 |                                         
+[183.94, 189.29]  |       0 |  .00 |                                         
+[189.29, 194.65]  |       0 |  .00 |                                         
+[194.65, 200.00]  |       1 |  .33 | *************    
+
+

If neither binCount, nor lowerBound nor upperBound are specified, the histogram will be autoscaled.

+

Histograms can be printed with their values, instead of bins. This is particularly useful for non +numeric tallied values, such as names::

+
val m = FrequencyMonitor<Car>()
+
+m.addValue(AUDI)
+m.addValue(AUDI)
+m.addValue(VW)
+repeat(4) { m. addValue(PORSCHE)}
+
+m.printHistogram()
+
+

The output of this:

+
Summary of: 'FrequencyMonitor.2'
+# Records: 7
+# Levels: 3
+
+Histogram of: 'FrequencyMonitor.2'
+              bin | entries |  pct |                                         
+AUDI              |       2 |  .29 | ***********                             
+VW                |       1 |  .14 | ******                                  
+PORSCHE           |       4 |  .57 | ***********************           
+
+

It is also possible to specify the values to be shown:

+
m.printHistogram(values = listOf(AUDI, TOYOTA)) 
+
+

This results in a further aggregated histogram view where non-selected values are agregated and listes values are forced in the display even if they were not observed.

+
Summary of: 'FrequencyMonitor.1'
+# Records: 7
+# Levels: 3
+
+Histogram of: 'FrequencyMonitor.1'
+              bin | entries |  pct |                                         
+AUDI              |       2 |  .29 | ***********                             
+TOYOTA            |       0 |  .00 |                                         
+rest              |       5 |  .71 | *****************************
+
+

It is also possible to sort the histogram on the weight (or number of entries) of the value:

+
m.printHistogram(sortByWeight = true)
+
+

The output of this:

+
Summary of: 'FrequencyMonitor.1'
+# Records: 7
+# Levels: 3
+
+Histogram of: 'FrequencyMonitor.1'
+              bin | entries |  pct |                                         
+PORSCHE           |       4 |  .57 | ***********************                 
+AUDI              |       2 |  .29 | ***********                             
+VW                |       1 |  .14 | ******
+
+

For numeric monitors it is possible to show values instead of ranges as bins +

val nlm = MetricTimeline()
+
+now += 2
+nlm.addValue(2)
+
+now += 2
+nlm.addValue(6)
+now += 4
+
+nlm.printHistogram(valueBins = false)
+nlm.printHistogram(valueBins = true)
+

+

which will result by default in

+

Histogram of: 'MetricTimeline.1'
+              bin | entries |  pct |                                         
+[.00, .60]        |     232 |  .23 | *********                               
+[.60, 1.20]       |       0 |  .00 |                                         
+[1.20, 1.80]      |       0 |  .00 |                                         
+[1.80, 2.40]      |     233 |  .23 | *********                               
+[2.40, 3.00]      |       0 |  .00 |                                         
+[3.00, 3.60]      |       0 |  .00 |                                         
+[3.60, 4.20]      |       0 |  .00 |                                         
+[4.20, 4.80]      |       0 |  .00 |                                         
+[4.80, 5.40]      |       0 |  .00 |                                         
+[5.40, 6.00]      |     535 |  .54 | *********************                   
+
+However, when valueBins is enabled the histogram becomes

+
Histogram of: 'MetricTimeline.1'
+              bin | entries |  pct |                                         
+0.0               |       2 |  .25 | **********                              
+2.0               |       2 |  .25 | **********                              
+6.0               |       4 |  .50 | ********************
+
+

Monitors Arithmetics

+

It is possible to merge the metric timeline monitors

+
val mtA = MetricTimeline()
+val mtB = MetricTimeline()
+
+// we can do all types of arithmetics
+mtA + mtB
+mtA - mtB
+mtA / mtB
+mtA * mtB
+
+// or work out their average over time
+listOf(mtA, mtB).mean()
+
+

It is also possible to merge the resulting statistics of multiple monitors

+
val flmA = CategoryTimeline(1)
+val flmB = CategoryTimeline(2)
+
+// ... run simulation 
+
+val mergedStats: EnumeratedDistribution<Int> = listOf(flmA, flmB).mergeStats()
+
+

See MergeMonitorTests for more examples regarding the other monitor types.

+

Slicing of monitors

+

Note: Slicing of monitors as in salabim is not yet supported. If needed please file a ticket.

+

Use-cases for slicing are

+
    +
  • to get statistics on a monitor with respect to a given time period, most likely a subrun
  • +
  • to get statistics on a monitor with respect to a recurring time period, like hour 0-1, hour 0-2, etc.
  • +
+

Summarizing a monitor

+

Monitor.statistics() returns a 'frozen' monitor that can be used to store the results not depending on the current environment. This is particularly useful for persisting monitor statistics for later analysis.

+

Visualization

+

It is possible to render monitors with the following extension functions +

NumericStatisticMonitor.display() 
+MetricTimeline.display()
+

+

+

In particular multiple outputs are supported here by the underlying kravis visualization windows, which allows forward backward navigation (via the arrow buttons). See org.kalasim.examples.bank.resources.Bank3ClerksResources for an example where multiple visualizing are combined to inspect the internal state of the simulation.

+

Note that, currently monitor visualization just works in retrospect, and it is not (yet) possible to view the progression while a simulation is still running.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/monitors_images/monitor.png b/monitors_images/monitor.png new file mode 100644 index 00000000..2f544cb1 Binary files /dev/null and b/monitors_images/monitor.png differ diff --git a/openrndr_features.png b/openrndr_features.png new file mode 100644 index 00000000..ff4f97f8 Binary files /dev/null and b/openrndr_features.png differ diff --git a/resource/index.html b/resource/index.html new file mode 100644 index 00000000..468e49b4 --- /dev/null +++ b/resource/index.html @@ -0,0 +1,2682 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Resources - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Resources

+

Resources are a powerful way of process interaction. Next to process definitions, resources are usually the most important elements of a simulation. Resources allow modeling rate-limits which are omnipresent in every business process.

+

A resource has always a capacity (which can be zero and even negative). This capacity will be specified at time of creation, but can be changed later with r.capacity = newCapacity. Note that this may lead to requesting components to be honored if possible.

+ + +

There are two of types resources:

+
    +
  • Claimable resources, where each claim is associated with a component (the claimer). It is not necessary that the claimed quantities are integer.
  • +
  • Depletable resources, where only the claimed quantity is registered. This is most useful for dealing with levels, lengths, etc.
  • +
+ + +

Claimable Resources

+

Claimable resources are declared with:

+
val clerks = Resource("clerks", capacity = 3)
+
+

Claimable resources have several attributes to query their status

+

clerks.claimed // currently claimed quantity
+clerks.available // currently available quantity
+
+clerks.capacity // current capacity
+
+clerks.occupancy // calculated by claimedQuantity / capacity
+
+clerks.requesters  // components currently requesting it 
+clerks.claimers // components currently claiming it 
+
+All these attributes are read-only, except for the capacity of the resource, which can be adjusted dynamically

+
clerks.capacity  = 3 // set capacity to 3
+
+

Any component can request from a resource in its process method. The user must not use request outside of a component's process definition.

+

request has the effect that the component will check whether the requested quantity from a resource is available. It is possible to check for multiple availability of a certain quantity from several resources.

+

Claimable resources have a queue called requesters containing all components trying to claim from the resource. In addition, there is a list claimers containing all components claiming from the resource. Both queues can not be modified but are very useful for analysis.

+

Notes

+
    +
  • request is not allowed for data components or main.
  • +
  • If to be used for the current component (which will be nearly always the case), use yield (request(...)).
  • +
  • If the same resource is specified more that once, the quantities are summed.
  • +
  • The requested quantity may exceed the current capacity of a resource.
  • +
  • The parameter failed will be reset by a calling request or wait.
  • +
+

Some Examples

+ +

Depletable Resources

+

For depletable (which are also sometimes referred to as anonymous) resources, it may be not allowed to exceed the capacity and have a component wait for enough (claimed) capacity to be available. That may be accomplished by using a negative quantity in the Component.request() call. However, to clarify the semantics of resource depletion, the API includes a dedicated DepletableResource.

+
    +
  • A depletable resource can be consumed with Component.take().
  • +
  • A depletable resource can refilled/recharged with Component.put().
  • +
+
+

Info

+

Both put() and take are just typesafe wrappers around request(). With put() quantities of resources are negated before calling Component.request() internally.

+
+

To create a depletable resource we do

+
val tank = DepletableResource(capacity = 10, initialLevel = 3)
+
+

We can declare its maximum capacity and its initial fill level. The latter is optional and defaults to the capacity of the resource.

+

In addition to the Resource attributes, depletable resources have the following attributes to streamline model +building

+
    +
  • level - Indicates the current level of the resource
  • +
  • isDepleted - Indicates if depletable resource is depleted (level==0)
  • +
  • isFull - Indicates if depletable resource is at full capacity
  • +
+

The model below illustrates the use of take and put. See the Gas Station simulation for a living example.

+

Examples using depletable resources +* Shipyard +* Lunar Mining which models deposits as depletable resource +* Gas Station where the central fuel storage is modeled as depletable resource

+

Request Scope

+

The recommended request usage pattern for resources is the request scope which

+
    +
  1. requests a resource,
  2. +
  3. executes some action,
  4. +
  5. and finally releases the claimed resources.
  6. +
+
request(clerks) { //1
+    hold(1, description = "doing something") //2
+} //3
+
+

In the example, kalasim will release the clerks automatically at the end of the request scope.

+

When requesting from a single resource in a nested way, claims are merged.

+

Unscoped Usage

+

The user can omit the request scope (not recommended and mostly not needed), and release claimed resources +with release().

+
request(clerks)
+
+hold(1, description = "doing something")
+
+release(clerks) 
+
+

Typically, this is only needed when releasing a defined quantity (other than the default quantity 1) from a resource with c.release(), e.g.

+
customer.release(clerks)  // releases all claimed quantity from r
+customer.release(clerks, 2)  // release quantity 2 from r
+
+

After a release, all other requesting components will be checked whether their claims can be honored.

+

Quantity

+

Some requests may request more than 1 unit from a resource. The number of requested resource units is called request quantity. Quantities are strictly positive, and kalasim also supports non-integer quantities. To request more than one unit from a resource, the user can use the follow API:

+
// request 1 from clerks 
+request(clerks)
+
+// request 2 elements from clerks
+request(clerks, quantity = 2)
+
+// also, an infix version is supported
+request(clerks withQuantity 2)
+
+
+// request can be decimals
+request(clerks, quantity = 1.234)
+
+// quantities must be positive. This will FAIL with an error
+request(clerks, quantity = -3) // will throw exception!
+
+

Request Honor Policies

+

When requesting, it may (and will) happen that a resource is currently fully claimed, and the request can not be honored right away. Requests may even queue up, if a resource is under more demand than it can serve. To resolve competing requests in an orderly fashion, kalasim supports different honor policies. An honor policy defines the order in which competing requests are honored.

+

Honor policies are applied to both claimable and also depletable resources.

+

Policy implementations extend org.kalasim.RequestHonorPolicy.The following policies are supported:

+
    +
  • Strict first come, first serve (StrictFCFS, default). This policy will honor request in order of appearance. So, it actually will wait to honor "big" requests, even if smaller requests that could be honored already are queueing up already. This is the default policy in kalasim, as we assume this being the most intuitive behavior in most situations.
  • +
  • Relaxed first come, first serve (RelaxedFCFS): This policy will honor claimable requests first. It will honor small requests even if larger requests are already waiting longer in line. FCFS is used as secondary order scheme in situations where multiple concurrent requests of the same quantity are waiting in line.
  • +
  • Smallest Quantity First (SQF) This policy tries to maximize "customer" throughput. Also this policy will fall back to an FCFS to resolve ambiguities. It will maximize the total number of requests being honored, whereas large requests may need to wait for a long time. For depletable resources, just imagine a resource that is constantly low on supply. When new supply becomes available, the resource could serve as many requesters as possible. Also, for regular resources this concept applies, e.g. in customer support, where customers require one or multiple mechanics, and the company decides to serve the least staffing-intense requests first.
  • +
  • Weighted FCFS (WeightedFCSC): Here the user can supply a weight α that is used to compute an ordering based on α * time_since_insert / quantity. This will progressively weigh the time since the request against request quantity. The policy will prefer smaller requests, but will ensure that also larger request are finally be honored.
  • +
  • Random Order (RandomOrder): This honor policy will honor requests in a random order. Sometimes real world processes lack a structured policy to resolve concurrent demand, so it may help understanding the current situation, before working out a better planning strategy.
  • +
+

As of now, the user can not provide custom RequestHonorPolicy implementations. To realize more sophisticated resource request regimes, she must implement their business specific request mechanism separately.

+
+

Important

+

Priorities always take precedence over the honor policy set for a resource. If a user sets a request priority, it will be respected first. That is, it does always try honoring by priority first, and only once all requests at the highest priority level are honored, it will climb down the ladder. Within a priority-level the selected honor policy is applied.

+
+
+

Note

+

A SQF policy could also be realized by using the negated quantity as request priority. However, for sake of clarity is recommended to use priorities to actually reflect business/domain needs, and use the provided SQL as baseline policy.

+
+

Request Priority

+

As multiple components may request the same resource, it is important to prioritize requests. This is possible by providing a request priority

+
request(clerks, priority = IMPORTANT)
+
+// or equivalently using the dsl-request-builder syntax
+request(clerks withPriority IMPORTANT) 
+
+

Irrespective of the used honor policy, kalasim will always honor requests on a resource sorted by priority.

+

There are different predefined priorities which correspond to the following sort-levels

+
    +
  • LOWEST (-20)
  • +
  • LOW (-10)
  • +
  • NORMAL (0, Default)
  • +
  • IMPORTANT (10)
  • +
  • CRITICAL (20)
  • +
+

The user can also create more fine-grained priorities with Priority(23)

+

Capacity Limit Modes

+

It may happen that request() (regular resources), take() or put() (depletable resources) would fail because the request quantity exceeds a resource's capacity. A CapacityLimitMode can be configured to handle such situations gracefully:

+
    +
  1. FAIL- Fail with a CapacityLimitException if request size exceeds resource capacity. (Default)
  2. +
  3. SCHEDULE - Schedule request even the current capacity won't ever honor the request, hoping for a later capacity increase.
  4. +
  5. CAP - Depletable resources also support capping put requests at capacity level
  6. +
+

Multiple resources

+

It is also possible to request for more resources at once. To enable this functionality in a typed manner, we provide a small builder API containing withPriority, withQuantity, and andPriority. In the following examples, we request 1 quantity from clerks AND 2 quantities from assistance.

+
request(
+    fireBrigade withQuantity 10,
+    ambulance withPriority IMPORTANT,
+    police withQuantity 3 andPriority IMPORTANT
+) 
+
+

Another method to query from a pool of resources are group requests. These are simply achieved by grouping resources in a List before requesting from it using oneOf=true.

+
//// ResourceGroups.kts
+import org.kalasim.Component
+import org.kalasim.Resource
+import kotlin.time.Duration.Companion.minutes
+
+val drMeier = Resource()
+val drSchreier = Resource()
+
+val doctors: List<Resource> = listOf(drMeier, drSchreier)
+
+object : Component() {
+    override fun process() = sequence {
+        request(doctors, oneOf = true) {
+            hold(5.minutes, "first aid")
+        }
+
+        // the patient needs brain surgery, only Dr Meier can do that
+        request(drMeier) {
+            hold(10.minutes, "brain surgery")
+        }
+    }
+}
+
+

Typical use cases are staff models, where certain colleagues have similar but not identical qualification. In case of the same qualification, a single resource with a capacity equal to the staff size, would be usually the better/correct solution.

+

Resource Selection

+

To request alternative resources, the user can set the parameter request(r1, r2 withQuantity 3, oneOf=true), which will would result in requesting 1 quantity from r1 OR 3 quantities from r2. With oneOf=true, we express to the simulation engine, that fulfilling one claim only is sufficient.

+ + + +

To also enable more controlled resource selection scenarios, there is a special mechanism to select resources +dynamically. With selectResource() a resource can be selected from a list of resources using a policy. There are several policies provided via ResourceSelectionPolicy:

+
    +
  • ShortestQueue: The resource with the shortest queue, i.e. the least busy resource is selected.
  • +
  • RoundRobin: Resources will be selected in a cyclical order.
  • +
  • FirstAvailable: The first available resource is selected.
  • +
  • RandomAvailable: An available resource is randomly selected.
  • +
  • Random: A resource is randomly selected.
  • +
+

The RandomAvailable and FirstAvailable policies check for resource availability i.e. whether the current capacity is sufficient to honor the requested quantity (defaulting to 1). Resources that do not meet this requirement will not be considered for selection. When using these policies, an error will be raised if all resources are unavailable.

+
+

Warning

+

With selectResource, a resource will be only selected. It won't actually request it.

+
+

Example

+
////ResourceSelection.kts
+import org.kalasim.*
+import org.kalasim.ResourceSelectionPolicy.ShortestQueue
+
+createSimulation {
+    enableComponentLogger()
+
+    val doctors = List(3) { Resource() }
+
+    class Patient : Component() {
+        override fun process() = sequence {
+            val requiredQuantity = 3
+
+            val selected = selectResource(
+                doctors,
+                quantity = requiredQuantity,
+                policy = ShortestQueue
+            )
+
+            request(selected withQuantity requiredQuantity) {
+                hold(10)
+            }
+        }
+    }
+
+    ComponentGenerator(exponential(1).minutes) { Patient() }
+    run(100)
+}
+
+

An alternative more direct approach to achieve round-robin resource selection (e.g. for nested calls) could also be implemented (example) +with an iterator.

+ + + + + + + + + + +

Events

+

Resources will log all changes with 2 event types

+

Resource Event

+

Events of type org.kalasim.ResourceEvent will indicate changes as they occur. The following fields are included in each event

+
    +
  • requestId: Long - A unique id, that allows to trace requests in time
  • +
  • time: SimTime
  • +
  • curComponent: Component?
  • +
  • requester: SimulationEntity
  • +
  • resource: Resource
  • +
  • type: ResourceEventType - Either REQUESTED, CLAIMED, RELEASED, PUT or TAKE.
  • +
  • quantity: Double
  • +
+

Resource Activity Event

+

Events of type org.kalasim.ResourceActivityEvent will be logged at the end of a scoped request block. The following fields are included in each event

+
    +
  • requested: SimTime
  • +
  • honored: SimTime
  • +
  • released: SimTime
  • +
  • requester: Component
  • +
  • resource: Resource
  • +
  • activity: String
  • +
  • quantity: Double
  • +
+

Activity Log

+

Resources have a activities attribute that provides a history of scoped requests as a List<ResourceActivityEvent>

+
r1.activities
+    .plot(y = { resource.name }, yend = { resource.name }, x = { start }, xend = { end }, color = { activity })
+    .geomSegment(size = 10.0)
+    .yLabel("Resource")
+
+

+

This visualization is also provided by a built-in display() extension for the activity log.

+

There's also a notebook with a complete example.

+

Timeline

+

The timeline attribute of a resource reports the progression of all its major metrics. The timeline provides a changelog of a resource in terms of:

+
    +
  • claimed capacity
  • +
  • capacity of the resource
  • +
  • availability of the resource
  • +
  • occupancy of the resource
  • +
  • # requesters in the queue of the resource at a given time
  • +
  • # claimers claiming from the resource at a given time
  • +
+

For convenience also 2 inferrable attributes are also included:

+
    +
  • availability
  • +
  • occupancy
  • +
+

Technically, the timeline is a List<ResourceTimelineSegment> that covers the entire lifespan of the resource as step functions per metric.

+

Example (from example notebook) that illustrates how the timeline can be used to visualize some aspects of the resource utilization over time.

+
r.timeline
+    .filter { listOf(ResourceMetric.Capacity, ResourceMetric.Claimed).contains(it.metric) }
+    .plot(x = { start }, y = { value }, color = { metric })
+    .geomStep()
+    .facetWrap("color", ncol = 1, scales = FacetScales.free_y)
+
+

+

This visualization is also provided by a built-in display() extension for the timeline attribute.

+

Monitors

+

Resources have a number of monitors:

+
    +
  • claimers
      +
    • queueLength
    • +
    • lengthOfStay
    • +
    +
  • +
  • requesters
      +
    • queueLength
    • +
    • lengthOfStay
    • +
    +
  • +
  • claimedTimeline
  • +
  • availabilityTimeline
  • +
  • capacityTimeline
  • +
  • occupancyTimeline (= claimed quantity / capacity)
  • +
+

By default, all monitors are enabled.

+

With r.printStatistics() the key statistics of these all monitors are printed. E.g.

+
{
+  "availableQuantity": {
+    "duration": 3000,
+    "min": 0,
+    "max": 3,
+    "mean": 0.115,
+    "standard_deviation": 0.332
+  },
+  "claimedQuantity": {
+    "duration": 3000,
+    "min": 0,
+    "max": 3,
+    "mean": 2.885,
+    "standard_deviation": 0.332
+  },
+  "occupancy": {
+    "duration": 3000,
+    "min": 0,
+    "max": 1,
+    "mean": 0.962,
+    "standard_deviation": 0.111
+  },
+  "name": "clerks",
+  "requesterStats": {
+    "queue_length": {
+      "all": {
+        "duration": 3000,
+        "min": 0,
+        "max": 3,
+        "mean": 0.564,
+        "standard_deviation": 0.727
+      },
+      "excl_zeros": {
+        "duration": 1283.1906989415463,
+        "min": 1,
+        "max": 3,
+        "mean": 1.319,
+        "standard_deviation": 0.49
+      }
+    },
+    "name": "requesters of clerks",
+    "length_of_stay": {
+      "all": {
+        "entries": 290,
+        "ninety_pct_quantile": 15.336764014133065,
+        "median": 6.97,
+        "mean": 5.771,
+        "ninetyfive_pct_quantile": 17.9504616361896,
+        "standard_deviation": 6.97
+      },
+      "excl_zeros": {
+        "entries": 205,
+        "ninety_pct_quantile": 17.074664209460025,
+        "median": 7.014,
+        "mean": 8.163,
+        "ninetyfive_pct_quantile": 19.28443602612993,
+        "standard_deviation": 7.014
+      }
+    },
+    "type": "QueueStatistics"
+  },
+  "type": "ResourceStatistics",
+  "timestamp": 3000,
+  "claimerStats": {
+    "queue_length": {
+      "all": {
+        "duration": 3000,
+        "min": 0,
+        "max": 3,
+        "mean": 2.885,
+        "standard_deviation": 0.332
+      },
+      "excl_zeros": {
+        "duration": 3000,
+        "min": 1,
+        "max": 3,
+        "mean": 2.885,
+        "standard_deviation": 0.332
+      }
+    },
+    "name": "claimers of clerks",
+    "length_of_stay": {
+      "all": {
+        "entries": 287,
+        "ninety_pct_quantile": 30,
+        "median": 0,
+        "mean": 30,
+        "ninetyfive_pct_quantile": 30,
+        "standard_deviation": 0
+      },
+      "excl_zeros": {
+        "entries": 287,
+        "ninety_pct_quantile": 30,
+        "median": 0,
+        "mean": 30,
+        "ninetyfive_pct_quantile": 30,
+        "standard_deviation": 0
+      }
+    },
+    "type": "QueueStatistics"
+  },
+  "capacity": {
+    "duration": 3000,
+    "min": 3,
+    "max": 3,
+    "mean": 3,
+    "standard_deviation": 0
+  }
+}
+
+

With println(r) a summary of the contents of the queues can be printed. E.g.:

+
{
+  "claimedQuantity": 3,
+  "requestingComponents": [
+    {
+      "component": "Customer.292",
+      "quantity": 1
+    },
+    {
+      "component": "Customer.291",
+      "quantity": 1
+    }
+  ],
+  "creationTime": 0,
+  "name": "clerks",
+  "claimedBy": [
+    {
+      "first": "Customer.288",
+      "second": null
+    },
+    {
+      "first": "Customer.289",
+      "second": null
+    },
+    {
+      "first": "Customer.290",
+      "second": null
+    }
+  ],
+  "capacity": 3
+}
+
+

Querying of the capacity, claimed quantity, available quantity and occupancy can be done with: +r.capacity, r.claimedQuantity, r.availableQuantity and r.occupancy. All quantities are tracked by corresponding level monitors to provide statistics.

+

If the capacity of a resource is constant, which is very common, the mean occupancy can be found with:

+
r.occupancyMonitor.statistics().mean
+
+

When the capacity changes over time, it is recommended to use:

+
occupancy = r.claimedTimeline.statistics().mean / r.capacityTimeline.statistics().mean()
+
+

to obtain the mean occupancy.

+

Note that the occupancy is set to 0 if the capacity of the resource is <= 0.

+

Pre-emptive Resources

+ + +

It is possible to specify that a resource is to be preemptive, by adding preemptive = true when the resource is created.

+ + +

If a component requests from a preemptive resource, it may bump component(s) that are claiming from the resource, provided these have a lower priority. If component is bumped, it releases the resource and is then activated, thus essentially stopping the current action (usually hold or passivate).

+

Therefore, a component claiming from a preemptive resource should check whether the component is bumped or still +claiming at any point where they can be bumped. This can be done with the method Component.isClaiming(resource) which is true if the component is claiming from the resource, or the opposite (Component.isBumped) which is true is the component is not claiming from the resource.

+

Examples using preemptive resources

+ + + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/resource_timeline.png b/resource_timeline.png new file mode 100644 index 00000000..9c286c71 Binary files /dev/null and b/resource_timeline.png differ diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..ebcfee42 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Welcome to kalasim","text":"

kalasim is a discrete event simulator. It provides a statically typed API, dependency injection, modern persistence, structured logging and automation capabilities.

kalasim is designed for simulation practitioners, process analysts and industrial engineers, who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases.

In contrast to many other simulation tools, kalasim is neither low-code nor no-code. It is code-first to enable change tracking, scaling, refactoring, CI/CD, unit-tests, and the rest of the gang that makes simulation development fun.

kalasim is written in Kotlin, is designed around suspendable coroutines for process definitions, runs on the JVM for performance and scale, is built with koin as dependency wiring framework, and is using common-math for stats and distributions. See acknowledgements for further references. kalasim is agnostic regarding a visualization frontend, but we provide bindings/examples using plotly.kt, lets-plot as well as kravis.

Meet kalasim at KotlinConf

We presented at KotlinConf 2023 in Amsterdam! We were there together with other technology leads from cloud, mobile & data-science for a great week of discussion and knowledge sharing. Our talk about \"Make more money by modeling and optimizing your business processes with Kotlin\" was well perceived and a lot of fun. Enjoy:

"},{"location":"#core-features","title":"Core Features","text":"

kalasim is a generic process-oriented discrete event simulation (DES) engine.

  • Simulation entities have a generative process description that defines the interplay with other entities
  • There is a well-defined rich process interaction vocabulary, including hold, request, wait or passivate
  • An event trigger queue maintains future action triggers and acts as sole driver to progress simulation state
  • Built-in monitoring and statistics gathering across the entire API

Find out more about the basics of a kalasim simulation.

"},{"location":"#first-example","title":"First Example","text":"

Let\u2019s start with a very simple model. The example demonstrates the main mode of operation, the core API and the component process model implemented in kalasim. We want to build a simulation where a single car is driving around for a some time before stopping in front of a red traffic light.

////Cars.kts\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass Driver : Resource()\nclass TrafficLight : State<String>(\"red\")\n\nclass Car : Component() {\n\n    val trafficLight = get<TrafficLight>()\n    val driver = get<Driver>()\n\n    override fun process() = sequence {\n        request(driver) {\n            hold(30.minutes, description = \"driving\")\n\n            wait(trafficLight, \"green\")\n        }\n    }\n}\n\ncreateSimulation {\n    enableComponentLogger()\n\n    dependency { TrafficLight() }\n    dependency { Driver() }\n\n    Car()\n}.run(5.hours)\n

Curious about an in-depth analysis of this example? It's your lucky day, see here.

"},{"location":"#how-to-contribute","title":"How to contribute?","text":"

Feel welcome to post ideas and suggestions to the project tracker.

We always welcome pull requests. :-)

"},{"location":"#support","title":"Support","text":"

Feel welcome to post questions and ideas in the project's discussion forum

Feel also invited to chat with us in the kotlinlang.slack.com in the #kalasim channel.

"},{"location":"about/","title":"About","text":""},{"location":"about/#license","title":"License","text":"

kalasim is licensed under MIT License.

"},{"location":"about/#acknowledgements","title":"Acknowledgements","text":""},{"location":"about/#salabim","title":"salabim","text":"

kalasim started off as a blunt rewrite of salabim. We are deeply thankful for its permissive licence that enabled setting up kalasim. A great starting point was in particular the wonderful article salabim: discrete event simulation and animation in Python.

salabims excellent documentation and wonderful examples made this project possible after all. kalasim reimplements all core APIs of salabim in a more typesafe API while also providing better test coverage, real-time capabilities and (arguably) more modern built-in support for visualization.

  • Salabim, Discrete Event Simulation In Python - PyCon 2018 Talk
  • Python.init Podcast: Salabim - Great podcast episode with Ruud van der Ham
"},{"location":"about/#simmer","title":"simmer","text":"

simmer is a process-oriented and trajectory-based Discrete-Event Simulation (DES) package for R.

It centres around the concept of a trajectory that defines a component lifecycle. To enable scale it is built on top of Rcpp (C++ backend for R).

  • Great overview simmer: Discrete-Event Simulation for R, Ucar et al., 2019
  • Support for optimization in simmer.optim

We have adopted several examples and documentation bits from simmer, and are deeply grateful to the simmer developers for providing such a great and well maintained tool. simmer has also been a great source of inspiration to implement in particular the monitoring and visualization API of kalasim.

"},{"location":"about/#simjulia","title":"SimJulia","text":"

SimJulia is a combined continuous time / discrete event process oriented simulation framework written in Julia inspired by the Simula library DISCO and the Python library SimPy.

We have adopted several examples and documentation bits from SimJulia, and are deeply grateful its developers for providing such a great and well maintained tool.

"},{"location":"about/#simpy","title":"SimPy","text":"

SimPy is a process-based discrete-event simulation framework based on standard Python. Processes in SimPy are defined by Python generator functions. SimPy also provides various types of shared resources to model limited capacity congestion points (like servers, checkout counters and tunnels).

We have adopted several examples and documentation bits from SimPy, and are deeply grateful its developers for providing such a great and well maintained tool.

"},{"location":"about/#dsol","title":"DSOL","text":"

DSOL3 which is an open source, Java based suite of Java classes for continuous and discrete event simulation

  • The wonderful DSOL manual
  • The DSOL simulation suite - Enabling multi-formalism simulation in a distributed context, PhD Thesis, Peter Jacobs, 2005
  • Mastering D-SOL: A Java based suite for simulation with several examples, 2006
  • opentrafficsim is a traffic simulation built with DSOL3
"},{"location":"about/#libraries-used-to-build-kalasim","title":"Libraries used to build kalasim","text":"

kalasim is built on top of some great libraries. It was derived as merger of ideas, implementation and documentation from the following projects:

  • Kotlin - Not really a library, but for obvious reasons the foundation of this project
  • koin which is a pragmatic lightweight dependency injection framework for Kotlin developers
  • Apache Commons Math is a library of lightweight, self-contained mathematics and statistics components
  • jsonbuilder is a small artifact that serves a single purpose: It allows creating json using an idiomatic kotlin DSL. Its main purpose it to make sure kalasim provides a machine-readable log-format for all basics in a simulation.
  • kotest.io is a flexible and elegant multiplatform test framework, assertions library, and property test library for Kotlin. We use it to make sure kalasim fulfils its component contract.

Visualization

  • https://github.com/holgerbrandl/kravis which implements a grammar to create a wide range of plots using a standardized set of verbs
  • https://github.com/JetBrains/lets-plot-kotlin is an open-source plotting library for statistical data.

Inspirations

  • atomic-agents - Spatial Agent-based Modeling in JavaScript
"},{"location":"about/#youkit-profiler","title":"YouKit Profiler","text":"

With kalasim, we strive to enable large-scale time-discrete simulation models. To optimize the API and the engine for perormance, we rely on YourKit profiler. With its wonderful interface into JDK performace metrics, YourKit profiler allows us to signifantly improve the overall speed while reducing the memory footprint of kalasim.

YourKit supports open source projects with innovative and intelligent tools for monitoring and profiling Java and .NET applications. YourKit is the creator of YourKit Java Profiler.

"},{"location":"about/#repo-maintainer","title":"Repo Maintainer","text":"

Holger Brandl holds a Ph.D. degree in machine learning and has developed new concepts in the field of computational linguistics. More recently he has co-authored publications in high-ranking journals such as Nature and Science.

To stay in sync with what's happening in tech, he's developing open-source tools, methods and algorithms for bioinformatics, high-performance computing and data science. He's passionate about machine learning, AI, analytics, elegant APIs and data visualisation. His professional scope mainly centers around systems biology and industrial manufacturing.

"},{"location":"advanced/","title":"Advanced","text":""},{"location":"advanced/#clock-synchronization","title":"Clock Synchronization","text":"

In simulation a clear distinction is made between real time and simulation time. With real time we refer to the wall-clock time. It represents the execution time of the experiment. The simulation time is an attribute of the simulator.

To support use cases where a simulation may drive a demonstration or system check, the kalasim API allows to run a simulation at a defined clock speed. Such real-time simulations may be necessary

  • If you have hardware-in-the-loop
  • If the intent of the simulation is to drive a visualization of a process
  • If there is human interaction with your simulation, or
  • If you want to analyze the real-time behavior of an algorithm

import org.kalasim.*\nimport kotlin.time.Duration.Companion.seconds\n\nval timeBefore = System.currentTimeMillis()\n\ncreateSimulation {\n    enableComponentLogger()\n\n    // enable real-time clock synchronization\n    ClockSync(tickDuration = 1.seconds)\n\n    run(10)\n}\n\nprintln(\"time passed ${System.currentTimeMillis() - timeBefore})\")\n
This example will execute in 10 seconds. Since the simulation is empty (for educational reasons to keep the focus on the clock here), it is entirely idle during that time.

To enable clock synchronization, we need to add a ClockSync to our simulation. We need to define what one tick in simulation time corresponds to in wall time. In the example, one tick equals to one second wall time. This is configured with the parameter tickDuration. It defines the duration of a simulation tick in wall clock coordinates. It can be created with Duration.ofSeconds(1), Duration.ofMinutes(10) and so on.

ClockSync also provides settings for more advanced uses-cases

  • To run simulations, in more than realtime, the user can specify speedUp to run a simulation faster (speedUp > 1) or slower (speedUp < 1) than realtime. It defaults to 1, that is no speed-up will be applied.
  • The argument syncsPerTick defines how often a clock synchronization should happen. Per default it synchronizes once per tick (i.e. an 1-increment of simulation time).

It may happen that a simulation is too complex to run at a defined clock. In such a situation, it (i.e. Environment.run()) will throw a ClockOverloadException if the user has specified a maximum delay maxDelay parameter between simulation and wall clock coordinates.

"},{"location":"advanced/#operational-control","title":"Operational Control","text":"

Even if kalasim tries to provide a simplistic, efficient, declarative approach to define a simulation, it may come along with computational demands simulation. To allow introspection into time-complexity of the underlying computations, the user may want to enable the built-in env.tickMetrics monitor to analyze how much time is spent per time unit (aka tick). This monitor can be enabled by calling enableTickMetrics() when configuring the simulation.

import org.kalasim.*\nimport org.kalasim.plot.letsplot.display\n\ncreateSimulation {\n    enableTickMetrics()\n\n    object : Component() {\n        override fun process() = sequence {\n            while(true) {\n                // create some artificial non-linear compute load\n                if(nowTT.value < 7)\n                    Thread.sleep((nowTT.value * 100).toLong())\n                else {\n                    Thread.sleep(100)\n                }\n\n                hold(1.minutes)\n            }\n        }\n    }\n\n    run(10.hours)\n\n    tickMetrics.display().show()\n}\n
"},{"location":"advanced/#performance-tuning","title":"Performance tuning","text":"

There are multiple ways to improve the performance of a simulation.

  1. Disable internal event logging: The interaction model is configured by default to provide insights into the simulation via the event log. However, to optimize performance of a simulation a user may want to consume only custom event-types. If so, internal interaction logging can be adjusted by setting a logging policy.
  2. Disable component statistics: Components and queues log various component statistics with built-in monitors which can be adjusted by setting a logging policy to reduce compute and memory footprint of a simulation.
  3. Set the correct AssertMode: The assertion mode determines which internal consistency checks are being performed. The mode can be set to Full (Slowest), Light (default) or Off (Fastest). Depending on simulation logic and complexity, this will improve performance by ~20%.

To further fine-tune and optimize simulation performance and to reveal bottlenecks, a JVM profiler (such as yourkit or the built-in profiler of Intellij IDEA Ultimate) can be used. Both call-counts and spent-time analysis have been proven useful here.

"},{"location":"advanced/#continuous-simulation","title":"Continuous Simulation","text":"

For some use-cases, simulations may run for a very long simulation and wall time. To prevent internal metrics gathering from consuming all available memory, it needs to be disabled or at least configured carefully. This can be achieved, but either disabling timelines and monitors manually on a per-entity basis, or by setting a sensible default policy via Environment.entityTrackingDefaults

For each entity type a corresponding tracking-policy TrackingConfig can be provisioned along with an entity matcher to narrow down its scope. A tracking-policy allows to change

  1. How events are logged
  2. How internal metrics are gathered

There are different default implementations, but the user can also implement and register custom tracking-configurations.

  • ComponentTrackingConfig
  • ResourceTrackingConfig
  • StateTrackingConfig
  • ComponentCollectionTrackingConfig
//import org.kalasim.*\nimport org.kalasim.misc.*\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass Driver : Resource(trackingConfig = ResourceTrackingConfig(trackUtilization = false))\nclass TrafficLight : State<String>(\"red\", trackingConfig = StateTrackingConfig(logCreation = false))\n\nclass Car : Component(\n    trackingConfig = ComponentTrackingConfig(logInteractionEvents = false)\n) {\n\n    val trafficLight = get<TrafficLight>()\n    val driver = get<Driver>()\n\n    override fun process() = sequence {\n        request(driver) {\n            hold(30.minutes, description = \"driving\")\n\n            wait(trafficLight, \"green\")\n        }\n    }\n}\n\ncreateSimulation {\n    enableComponentLogger()\n\n    // in addition or alternatively we can also change the environment defaults\n    entityTrackingDefaults.DefaultComponentConfig =\n        ComponentTrackingConfig(logStateChangeEvents = false)\n\n    // create simulation entities\n    dependency { TrafficLight() }\n    dependency { Driver() }\n\n    Car()\n}.run(5.hours)\n

Note

Tracking configuration policies defaults must be set before instantiating simulation entities to be used

To disable all metrics and to minimize internal event logging, the user can run env.entityTrackingDefaults.disableAll()

The same mechanism applies also fine-tune the internal event logging. By disabling some - not-needed for production - events, simulation performance can be improved significantly.

"},{"location":"advanced/#save-and-load-simulations","title":"Save and Load Simulations","text":"

kalasim does not include a default mechanism to serialize and deserialize simulations yet. However, it seems that with xstream that Environment can be saved including its current simulation state across all included entities. It can be restored from the xml snapshot and continued with run().

We have not succeeded to do the same with gson yet. Also, some experiments with kotlinx.serialization were not that successful.

"},{"location":"advanced/#internal-state-validation","title":"Internal State Validation","text":"

The simulation engine provides different levels of internal consistency checks. As these are partially computationally expensive these can be be/disabled. There are 3 modes

  • OFF - Productive mode, where asserts that may impact performance are disabled.
  • LIGHT - Disables compute-intensive asserts. This will have a minimal to moderate performance impact on simulations.
  • FULL - Full introspection, this will have a measurable performance impact on simulations. E.g. it will validate that passive components are not scheduled, and queued components have unique names.

Switching off asserts, will typically optimize performance by another ~20% (depending on simulation logic).

"},{"location":"analysis/","title":"Analysis","text":"

A core aspect when building simulations is to understand, define and modulate the inherent system dynamics. To build a correct simulation, the designer/developer must carefully analyze how states progress over time.

To facilitate this process, kalasim offers various means to analyze data created by a simulation

  • The Event Log tracks events in a simulation
  • Monitors track state and statistics of the basic elements within a simulation, and may be used for domain-specific entities as well
  • Lifecycle Records summarize a component's states history
  • visualization to inspect complex spatio-temporal patterns
"},{"location":"analysis/#monitors","title":"Monitors","text":"

See chapter about monitors.

"},{"location":"analysis/#event-log","title":"Event Log","text":"

See chapter about event logging.

"},{"location":"analysis/#visualization","title":"Visualization","text":"

See chapter about visualization.

"},{"location":"analysis/#component-status","title":"Component Status","text":"

The state transition of a component provide value insight into its behavior. This is facilitated by lifecycle statistics ComponentLifecycleRecord that summarize a component's states history.

These data can also be transformed easily into a table as well

val customers : List<Component> // = ...\nval records: List<ComponentLifecycleRecord> = customers.map { it.toLifeCycleRecord() }\n\nrecords.asDataFrame()\n

This transforms the customers straight into a krangl dataframe with the following structure

A DataFrame: 1034 x 11\n      component   createdAt   inCurrent    inData   inDataSince   inInterrupted   inPassive\n 1    Vehicle.1       0.366           0   989.724        10.276               0           0\n 2    Vehicle.2       1.294           0   984.423        15.577               0           0\n 3    Vehicle.3       1.626           0   989.724        10.276               0           0\n 4    Vehicle.4       2.794           0   989.724        10.276               0           0\nand 1024 more rows, and and 4 more variables: inScheduled, inStandby, inWaiting\n

Clearly if needed, the user may also work with the records directly. For instance to configure a visualization.

"},{"location":"analysis/#replication","title":"Replication","text":"

Running a simulation just once, often does not provide sufficient insights into the dynamics of the system under consideration. Often, the user may want to execute a model many times with altered initial conditions, and then perform a statistical analysis over the output. This is also considered as what-if analyis. See here for simple example.

By design kalasim does not make use of parallelism. So when scaling up execution to run in paralell, we need to be careful, that the internal dependency injection (which relates by default to a global context variable) does not cause trouble. See here for an example that defines a parameter grid to be assessed with multi-threading with a simulation run per hyper-parameter.

"},{"location":"analysis/#component-tracking","title":"Component Tracking","text":"

To prevent memory leaks, the environment just keeps track of scheduled components, that is components that are queued for execution. In some situations the user may want to track all components irrespective of their queuing status. This can be achieved by setting up a component collector before creating the components

createSimulation{\n    val cc = componentCollector()\n\n    // create components\n    Component(\"foo\")\n    Component(\"bar\")\n\n    // analyze all components created until this point\n    cc.size // will be 2\n}\n
"},{"location":"animation/","title":"Process Animation","text":"

Animation is a powerful tool to debug, test and demonstrate simulations.

It is possible use shapes (lines, rectangles, circles, etc), texts as well image to visualize the state of a simulation model. Statistical properties may be animated by showing the current value against the time.

Process animations can be

  • Synchronized with the simulation clock and run in real time (synchronized)
  • Advanced per simulation event (non-synchronized)
"},{"location":"animation/#how-to-get-started","title":"How to get started?","text":"

All it takes is a single dependency

dependencies {\n    api(\"com.github.holgerbrandl:kalasim-animation:0.7.97\")\n}\n

The dependency pull everything you need to animate simulations.

For fully worked out examples, have a look at the lunar mining or the office tower.

If you're not sure how to configure gradle, you could also start with the provided processes animation template project.

"},{"location":"animation/#under-the-hood","title":"Under the hood","text":"

OPENRNDR is an open source framework for creative coding, written in Kotlin that simplifies writing real-time interactive software.

For more details see https://openrndr.org/

Process animation with kalasim is using OPENRNDR as backend and rendering engine. Animation is not part of the core API of kalasim, but support is provided by a decorator types (extending their respective base-type)

  • Component -> AnimationComponent
  • Resource -> AnimationResource
  • ComponentQueue -> AnimationResource

These components are worked out below.

"},{"location":"animation/#animation-template","title":"Animation Template","text":"

The basic structure of a process animation is as follows

// package org.kalasim.animation\n\nimport kotlinx.coroutines.*\nimport org.kalasim.ClockSync\nimport org.kalasim.Environment\nimport org.kalasim.misc.DependencyContext\nimport org.openrndr.application\nimport org.openrndr.color.ColorRGBa\nimport org.openrndr.draw.loadFont\nimport org.openrndr.draw.loadImage\nimport java.awt.geom.Point2D\nimport java.lang.Thread.sleep\nimport kotlin.time.Duration.Companion.milliseconds\nimport kotlin.time.DurationUnit\n\nfun main() {\n    application {\n        // setup simulation model\n        val sim = object : Environment(tickDurationUnit = DurationUnit.SECONDS) {\n            init {\n                ClockSync(tickDuration = 10.milliseconds, syncsPerTick = 100)\n            }\n\n            // instantiate components (not fully worked out here)\n            val worker = AnimationComponent(Point2D.Double(1.0, 3.0))\n        }\n\n        // configure the window\n        configure {\n            width = 1024\n            height = 800\n            windowResizable = true\n            title = \"Simulation Name\"\n        }\n\n        var frameCounter = 0\n\n        program {\n            // load resources such as images\n            val image = loadImage(\"src/main/resources/1024px-Phlegra_Montes_on_Mars_ESA211127.jpg\")\n//            val truck = loadSVG(\"src/main/resources/tractor-svgrepo-com.svg\")\n            val font = loadFont(\"file:IBM_Plex_Mono/IBMPlexMono-Bold.ttf\", 24.0)\n\n            // optionally enable video recording\n//            extend(ScreenRecorder())\n\n            extend {\n                // draw background\n                drawer.image(image, 0.0, 0.0, width.toDouble(), height.toDouble())\n\n                // visualize simulation entities\n                with(drawer) {\n                    val workerPosition = sim.worker.currentPosition\n                    circle(workerPosition.x, workerPosition.y, 10.0)\n                }\n\n\n                // draw info & statistics\n                drawer.defaults()\n                drawer.fill = ColorRGBa.WHITE\n                drawer.fontMap = font\n                drawer.text(\"NOW: ${sim.now}\", width - 150.0, height - 30.0)\n                drawer.text(\"Frame: ${frameCounter++}\", width - 150.0, height - 50.0)\n            }\n        }\n\n        // Start simulation model\n        CoroutineScope(Dispatchers.Default).launch {\n            //rewire koin context for dependency injection to async execution context\n            DependencyContext.setKoin(sim.getKoin())\n            // wait because Openrndr needs a second to warm up\n            sleep(3000)\n            sim.run()\n        }\n    }\n}\n
Templates including gradle build files) sources can be found in the repo. F

For an in-depth walkthrough of the elements the an animation, see https://guide.openrndr.org/

"},{"location":"animation/#animating-components","title":"Animating Components","text":"

By changing the base class of a component from Component to org.kalasim.animation.AnimationComponent, we decorate the original with the following features

  • Instances can have an initial position (modelled as Point2D)
  • With moveTo(newLocation:Point2D) the API provides suspendable wrapper around hold()
  • While being on hold, an animation can always request the current position with c.currentPosition. Positions are linearly interpolated.
"},{"location":"animation/#animating-hold-interactions","title":"Animating hold() Interactions","text":"

An animation can track the status hold() interaction with holdProgress. It's a 2 step process

  1. First, we need to register what type of holds we would like to monitor

    val UNLOADING = \"Unloading\"\nval c: Component = Component()\n\nc.registerHoldTracker(UNLOADING) { it.description.startsWith(\"unloading\")}\n

  2. Once it has been registered, the tracker can be consumed in the rendering loop with isHolding and holdProgress.

    if(c.isHolding(UNLOADING)) {\n    drawer.contour(contour.sub(0.0, (1 - c.holdProgress(UNLOADING)!!)))\n}\n

For a fully worked out example, see how the mining process is animated in the lunar mining demo.

"},{"location":"animation/#animating-resources","title":"Animating Resources","text":"

Dedicated support for resource rendering is coming soon. See lunar mining to see how it's done.

"},{"location":"animation/#animating-states","title":"Animating States","text":"

Dedicated support for state rendering is coming soon.

"},{"location":"animation/#animating-queues-collections","title":"Animating Queues & Collections","text":"

Dedicated support for collection rendering is coming soon.

"},{"location":"animation/#other-animation-frontends","title":"Other animation frontends","text":"

The animation support API does not bind to a particular rendering engine. However, until now only https://openrndr.org/ has been explored for process animation with kalasim.

"},{"location":"basics/","title":"Simulation Basics","text":"

The beauty of discrete event simulation is its very limited vocabulary which still allows expressing complex system dynamics. In essence, kalasim relies on just a handful of elements to model real-world processes.

  • Components
  • Resources
  • States
  • Collections
  • Generators
"},{"location":"basics/#simulation-environment","title":"Simulation Environment","text":"

All entities in a simulation are governed by an environment context. Every simulation lives in exactly one such environment. The environment provides means for controlled randomization, dependency injection, and most importantly manages the event queue.

The environment context of a kalasim simulation is an instance of org.kalasim.Environment, which can be created using simple instantiation or via a builder called createSimulation

val env : Environment = createSimulation(){\n    // enable logging of built-in simulation metrics\n    enableComponentLogger()\n\n    // Create simulation entities in here \n    Car()\n    Resource(\"Car Wash\")\n}.run(5.minutes)\n

Within its environment, a simulation contains one or multiple components with process definitions that define their behavior and interplay with other simulation entities.

Very often, the user will define custom Environments to streamline simulation API experience.

class MySim(val numCustomers: Int = 5) : Environment() {\n    val customers = List(numCustomers) { Customer(it) }\n}\n\nval sim = MySim(10)\nsim.run()\n\n// analyze customers\nsim.customers.first().statusTimeline.display()\n

To configure references first, an Environment can also be instantiated by configuring dependencies first with configureEnvironment. Check out the Traffic example to learn how that works.

"},{"location":"basics/#running-a-simulation","title":"Running a simulation","text":"

In a discrete event simulation a clear distinction is made between real time and simulation time. With real time we refer to the wall-clock time. It represents the execution time of the experiment. The simulation time is an attribute of the simulator.

As shown in the example from above a simulation is usually started with sim.run(duration). The simulation will progress for duration which is an instance of kotlin.time.Duration. By doing so we may stop right in the middle of a process. As shown in the example from above a simulation is usually started with sim.run(duration). The simulation will progress for duration which is an instance of kotlin.time.Duration. By doing so we may stop right in the middle of a process.

sim.run(2.hours)\n\nsim.run(1.4.days) // fractionals are suportes as well\nsim.run(until = now + 3.hours) // simulation-time plus 3 hours\n

Alternatively for backward compatbility reasons and to write down examples without any specific time dimension, we can also run for a given number of ticks which is resolved by the tickDuration of the simulation enviroment.

sim.run(23) // run for 23 ticks\nsim.run(5) // run for some more ticks\n\nsim.run(until = 42.asTickTime()) // run until internal simulation clock is 42 \n\nsim.run() // run until event queue is empty\n

Tip

A component can always stop the current simulation by calling stopSimulation() in its process definition. See here for fully worked out example.

"},{"location":"basics/#event-queue","title":"Event Queue","text":"

The core of kalasim is an event queue ordered by scheduled execution time, that maintains a list of events to be executed. To provide good insert, delete and update performance, kalasim is using a PriorityQueue internally. Components are actively and passively scheduled for reevaluating their state. Technically, event execution refers to the continuation of a component's process definition.

Kalasim Execution Model"},{"location":"basics/#execution-order","title":"Execution Order","text":"

In the real world, events often appear to happen at the same time. However, in fact events always occur at slightly differing times. Clearly the notion of same depends on the resolution of the used time axis. Birthdays will happen on the same day whereas the precise birth events will always differ in absolute timing.

Even if real-world processes may run \"in parallel\", a simulation is processed sequentially and deterministically. With the same random-generator initialization, you will always get the same simulation results when running your simulation multiple times.

Although, kalasim supports double-precision to schedule events, events will inevitably arise that are scheduled for the same time. Because of its single-threaded, deterministic execution model (like most DES frameworks), kalasim processes events sequentially \u2013 one after another. If two events are scheduled at the same time, the one scheduled first will also be the processed first (FIFO).

As pointed out in Ucar, 2019, there are many situations where such simultaneous events may occur in simulation. To provide a well-defined behavior in such situations, process interaction methods (namely wait, request, activate and reschedule) support user-provided schedule priorities. With the parameter priority in these interaction methods, it is possible to order components scheduled for the same time in the event-queue. Events with higher priority are executed first in situations where multiple events are scheduled for the same simulation time.

There are different predefined priorities which correspond the following sort-levels

  • LOWEST (-20)
  • LOW (-10)
  • NORMAL (0)
  • IMPORTANT (10)
  • CRITICAL (20)

The user can also create more fine-grained priorities with Priority(23)

In contrast to other DSE implementations, the user does not need to make sure that a resource release() is prioritized over a simultaneous request(). The engine will automatically reschedule tasks accordingly.

So the key points to recall are

  • Real world events may appear to happen at the same discretized simulation time
  • Simulation events are processed one after another, even if they are scheduled for the same time
  • Race-conditions between events can be avoided by setting a priority
"},{"location":"basics/#configuring-a-simulation","title":"Configuring a Simulation","text":"

To minimze initial complexity when creating an environment, some options can be enabled within the scope of an environment * enableTickMetrics() - See tick metrics * enableComponentLogger() - Enable the component logger to track component status

"},{"location":"basics/#dependency-injection","title":"Dependency Injection","text":"

Kalasim is building on top of koin to inject dependencies between elements of a simulation. This allows creating simulation entities such as resources, components or states conveniently without passing around references.

class Car : Component() {\n\n    val gasStation by inject<GasStation>()\n\n    // we could also distinguish different resources of the same type \n    // using a qualifier\n//    val gasStation2 : GasStation by inject(qualifier = named(\"gs_2\"))\n\n    override fun process() = sequence {\n        request(gasStation) {\n            hold(2, \"refill\")\n        }\n\n        val trafficLight = get<TrafficLight>()\n        wait(trafficLight, \"green\")\n    }\n}\n\ncreateSimulation{\n    dependency { TrafficLight() }\n    dependency { GasStation() }\n\n    // declare another gas station and specify \n    dependency(qualifier = named(FUEL_PUMP)) {}\n\n    Car()\n}\n
As shown in the example, the user can simply pull dependencies from the simulation environment using get<T>() or inject<T>(). This is realized with via Koin Context Isolation provided by a thread-local DependencyContext. This context is a of type DependencyContext. It is automatically created when calling createSimulation or by instantiating a new simulation Environment. This context is kept as a static reference, so the user may omit it when creating simulation entities. Typically, dependency context management is fully transparent to the user.

Environment().apply {\n    // implicit context provisioning (recommended)\n    val inUse = State(true)\n\n    // explicit context provisioning\n    val inUse2 = State(true, koin = getKoin())\n}\n

In the latter case, the context reference is provided explicitly. This is usually not needed nor recommended.

Instead of sub-classing, we can also use qualifiers to refer to dependencies of the same type

class Car : Component() {\n\n    val gasStation1 : GasStation by inject(qualifier = named(\"gas_station_1\"))\n    val gasStation2 : GasStation by inject(qualifier = named(\"gas_station_2\"))\n\n    override fun process() = sequence {\n        // pick a random gas-station\n        request(gasStation, gasStation, oneOf = true) {\n            hold(2, \"refill\")\n        }\n    }\n}\n\ncreateSimulation{\n    dependency(qualifier = named(\"gas_station_1\")) { GasStation() }\n    dependency(qualifier = named(\"gas_station_2\")) { GasStation() }\n\n    Car()\n}\n
"},{"location":"basics/#threadsafe-registry","title":"Threadsafe Registry","text":"

Because of its thread locality awareness, the dependency resolver of kalasim allows for parallel simulations. That means, that even when running multiple simulations in parallel in different threads, the user does not have to provide a dependency context (called koin) argument when creating new simulation entities (such as components).

For a simulation example with multiple parallel Environments see ATM Queue

"},{"location":"basics/#simple-types","title":"Simple Types","text":"

Koin does not allow injecting simple types. To inject simple variables, consider using a wrapper class. Example

////SimpleInject.kts\nimport org.kalasim.*\n\ndata class Counter(var value: Int)\n\nclass Something(val counter: Counter) : Component() {\n\n    override fun process() = sequence<Component> {\n        counter.value++\n    }\n}\ncreateSimulation {\n    dependency { Counter(0) }\n    dependency { Something(get()) }\n\n    run(10)\n}\n

For details about how to use lazy injection with inject<T>() and instance retrieval with get<T>() see koin reference.

Examples

  • Traffic
  • Car Wash
  • Gas Station
"},{"location":"basics/#randomness-distributions","title":"Randomness & Distributions","text":"

Experimentation in a simulation context relates to large part to controlling randomness. With kalasim, this is achieved by using probabilistic distributions which are internally backed by apache-commons-math. A simulation always allows deterministic execution while still supporting pseudo-random sampling. When creating a new simulation environment, the user can provide a random seed which used internally to initialize a random generator. By default kalasim, is using a fixed seed of 42. Setting a seed is in particular useful when running a simulation repetitively (possibly with parallelization).

createSimulation(randomSeed = 123){\n    // internally kalasim will create a random generator\n    //val r = Random(randomSeed)\n\n    // this random generator is used automatically when\n    // creating distributions\n    val normDist = normal(2)   \n}\n

With this internal random generator r, a wide range of probability distributions are supported to provide controlled randomization. That is, the outcome of a simulation experiment will be the same if the same seed is being used.

Important

All randomization/distribution helpers are accessible from an Environment or SimulationEntity context only. That's because kalasim needs the context to associate the random generator of the simulation (which is also bound to the current thread).

Controlled randomization is a key aspect of every process simulation. Make sure to always strive for reproducibility by not using randomization outside the simulation context.

"},{"location":"basics/#continuous-distributions","title":"Continuous Distributions","text":""},{"location":"basics/#numeric-distributions","title":"Numeric Distributions","text":"

The following continuous distributions can be used to model randomness in a simulation model

  • uniform(lower = 0, upper = 1)
  • exponential(mean = 3)
  • normal(mean = 0, sd = 1, rectify=false)
  • triangular(lowerLimit = 0, mode = 1, upperLimit = 2)
  • constant(value)

All distributions functions provide common parameter defaults where possible, and are defined as extension functions of org.kalasim.SimContext. This makes the accessible in environment definitions, all simulation entities, as well as process definitions.

The normal distribution can be rectified, effectively capping sampled values at 0 (example normal(3.days, rectify=true)). This allows for zero-inflated distribution models under controlled randomization.

Example:

object : Component() {\n    val waitDist = exponential(3.3) // this is bound to env.rg\n\n    override fun process() = sequence {\n        hold(waitDist()) \n    }\n} \n

As shown in the example, probability distributions can be sampled with invoke ().

"},{"location":"basics/#constant-random-variables","title":"Constant Random Variables","text":"

The API also allow to model constant random variables using const(<some-value>). These are internally resolved as org.apache.commons.math3.distribution.ConstantRealDistribution. E.g. consider the time until a request is considered as failed:

val dist =  constant(3)\n// create a component generator with a fixed inter-arrival-time\nComponentGenerator(iat = dist) { Customer() }\n
"},{"location":"basics/#duration-distributions","title":"Duration Distributions","text":"

Typically randomization in a discrete event simulation is realized by stochastic sampling of time durations. To provide a type-safe API for this very common usecase, all continuous distributions are also modeled to sample kotlin.time.Duration in addtion Double. Examples:

// Create a uniform distribution between 3 days and 4 days and a bit  \nval timeUntilArrival = uniform(lower = 3.days, upper = 4.days + 2.hours)\n\n// We can sample distributions by using invoke, that is () \nval someTime : Duration= timeUntilArrival() \n\n// Other distributions that support the same style\nexponential(mean = 3.minutes)\n\nnormal(mean = 10.days, sd = 1.hours, rectify=true)\n\ntriangular(lowerLimit = 0.days, mode = 2.weeks, upperLimit = 3.years)\n\nconstant(42.days)\n

Tip

In addition to dedicated duration distributions, all numeric distributions can be converted to duration distributions using duration unit indicators suffices. E.g normal(23).days

"},{"location":"basics/#enumerations","title":"Enumerations","text":"

Very often when working out simulation models, there is a need to sample with controlled randomization, from discrete populations, such as integer-ranges, IDs, enums or collections. Kalasim supports various integer distributions, uuid-sampling, as well as type-safe enumeration-sampling.

  • discreteUniform(lower, upper) - Uniformly distributed integers in provided interval
  • uuid() - Creates a random-controlled - i.e. deterministic - series of universally unique IDs (backed by java.util.UUID)

Apart fom numeric distributions, also distributions over arbitrary types are supported with enumerated(). This does not just work with enums but with arbitrary types including data classes.

enum class Fruit{ Apple, Banana, Peach }\n\n// create a uniform distribution over the fruits\nval fruit = enumerated(values())\n// sample the fruits\nval aFruit: Fruit = fruit()\n\n// create a non-uniform distribution over the fruits\nval biasedFruit = enumerated(Apple to 0.7, Banana to 0.1, Peach to 0.2 )\n// sample the distribution\nbiasedFruit()\n
"},{"location":"basics/#custom-distributions","title":"Custom Distributions","text":"

Whenever, distributions are needed in method signatures in kalasim, the more general interface org.apache.commons.math3.distribution.RealDistribution is being used to support a much wider variety of distributions if needed. So we can also use other implementations as well. For example

ComponentGenerator(iat = NakagamiDistribution(1, 0.3)) { Customer() }\n
"},{"location":"changes/","title":"Kalasim Release History","text":""},{"location":"changes/#10","title":"1.0","text":"

Major & Breaking API Changes

  • Most importantly we have migrated the API to use org.kalasim.SimTime to track simulation. SimTime is a simple typealias for kotlinx.datetime.Instant, effectively giving users the full flexibility of using a well designed and established date-time concept. org.kalasim.TickTime is still available for backward compatibility reasons, but is opt-in or required to subclass TickedComponent.
  • Simplified the configurability for tracking of entity timelines and statistics. It's now more direct via constructor parameters in addition to environment defaults
  • #68 Improved arithmetics of metric timelines
  • #65 provide a statistics API for the internal event bus
  • #69 Allow activating processes with argument in a type-safe manner

Minor improvements

  • #51 Added description for better readiability when supepending exeuction for simulatoin states using wait()
  • #56 Improved support for duration distributions
  • Expose Environment.getOrNull<T>() from koin to check for presence of registered dependencies in simulation environment
  • #46 clarify use of collect with filter
  • #52 Improved visualization of metric timelines to support zoom range
  • #67 & #64 Added more safety guard mechanisms to prevent context violations when branching component processes.

Starting with this release we have switched to calendar versioning for better clarity regarding our release density, timing and schedule.

"},{"location":"changes/#v011","title":"v0.11","text":"

Major improvements

  • significantly improved library performance
  • Added Int.Weeks extension
  • Introduced suspendable join(components: List<Component>) to wait for other components to become DATA

Documentation & Examples * New Example Shipyard - Multipart assembly

"},{"location":"changes/#v010","title":"v0.10","text":"

Released 2023-06-16

Breaking API Changes

  • tick metrics and component-logger are now configured and not enabled via constructor parameter any longer (to minimize constructor complexity)

Improvements

  • More robust dependency injection

Performance

  • Added jmh benchmark-suite and reporting

Documentation

  • Continued migration to Duration as replacement for Number in hold(), wait() etc.
"},{"location":"changes/#v09","title":"v0.9","text":"

Released at 2023-04-13

Major

  • #49 Changed API to always favor kotlin.time.Duration to express durations. Previously untyped Numbers were used that often led to confusion in larger simulations models. Evey simulation environment has now a DurationUnit such as seconds, hours, etc. (defaulting to minutes if not specified).
  • New opt-in annotations were introduced to prevent use of untyped duration arguments in interaction functions such as ``
  • Migrated use of Instant to kotlinx.datetime.Instant for better API consistency
  • New sampling functions to sample durations directly: val uni = uniform(5.minutes, 2.hours); uni() // results in Duration

Minor

  • Overwrite shuffled() and random() as extensions on Collection<T> in simulation entities to enable better control over randomization by default
"},{"location":"changes/#v08","title":"v0.8","text":"

Released announced at 2022-09-27

Milestone Enhancements

  • Implemented honor policies allowing for more configurable request queue consumption
    val r  = Resource(honorPolicy = RequestHonorPolicy.StrictFCFS)\n
  • Added Timeline Arithmetics. It is now possible to perform stream arithmetics on timeline attributes
  • Introduced different capacity modes if resource requests exceed resource capacity.
    val tank  = DepletableResource(capacity=100, initialLevel=60)\n\nput(gasSupply, 50, capacityLimitMode = CapacityLimitMode.CAP)\n
  • #23 Added support for duration extensions introduced in kotlin v1.6 to express durations more naturally with 2.hours, 3.minutes and so on. It is now possible to use java.time.Instant and kotlin.time.Duration in Component.hold() and Environment.run.
    createSimulation{\n    object: Component{\n        val driver = Resource(2) \n        override fun process() = sequence {\n            request(driver) {\n                hold(23.minutes)\n            }\n            hold(3.hours)\n        }\n\n    }\n}.run(2.5.days) // incl. fractional support\n

Major Enhancements

  • #37 Simplified process activation in process definitions
  • #34 Added support for triangular distributions
  • #43 Simplified states to consume predicates directly in wait()
  • #27 Made resource events more informative and consistent. These event now include a request-id to enable simplified bottleneck analyses
  • Added RequestScopeContext to honor-block of request including requestingSince time
  • #35 Improved support for asynchronous event consumption (contributed by pambrose via PR)
  • Reduced memory requirements of resource monitoring by 50% by inferring occupancy and availability using Timeline Arithmetics
  • #38 Extended and improved API support for depletable resources.
  • Added ComponentQueue.asSortedList() to sorted copy of underlying priority queue
  • Ported data-frame-support from krangl to the more modern kotlin-dataframe.

Minor enhancements

  • #47 Added entity auto-indexing to allow for more descriptive names
  • #50 Fixed trigger()
  • Introduced more event-types and improved structured logging capabilities
  • Renamed all info attributes to snapshot to convey intent better
  • Unified naming resource attributes
  • #28 Added support API to sample UUIDs with engine-controlled randomization
  • Added capacity to component collections
  • Reworked distribution support API for better API experience to enable controlled randomization in process models
  • Removed Resource.release() because of incomplete and unclear semantics
  • #53 Generified MetricsTimeline

Documentation

  • #38 Rewritten gas-station example to illustrate depletable resource usage
  • Added new datalore example workbook: Extended Traffic
  • Reworked The Office Tower to include better model description and animation
  • New: Lunar Mining model to illustrate new animation toolbox of kalasim
"},{"location":"changes/#v07","title":"v0.7","text":"

Released 2021-11-27

See release announcement

Major enhancements

  • Reworked event & metrics logging API
  • Introduced ComponentList
  • Implemented ticks metrics monitor (fixes #9)
  • New timeline and activity log attributes to resources for streamlined usage and capacity analysis
  • Extended display() support API on all major components and their collections (including Resource, Component or List<Component>, MetricTimeline) (fixes #18)
  • Thread-local context registry enabled via Koin Context Isolation (fixes #20)
  • Dramatically improved simulation performance

Documentation

  • New chapter about collections
  • Revised resource documentation
  • Rewritten ATM example to better illustrate parallelization and generators
  • New example Bridge Games
  • Started new canonical complex simulation example: emergency room

Minor enhancements

  • Added possibility stop a simulation from a process definition using `stopSimulation
  • Introduced AssertModes (Full, Light (default), None) to enable/disable internal consistency checks. This will optimize performance by another ~20% (depending on simulation logic)
  • Improved request priority API
  • Allow for runtime reconfiguration of ClockSync to enable adjustable simulation speed
  • Lifted Component sub-type requirement from ComponentQueue
  • Fixed oneOf in request()
  • Redesigned honorBlock in request() to return Unit and to provide claimed resource via it
    request(doctorFoo, doctorBar, oneOf = true) { doctor ->\n    println(\"patient treated by $doctor\")\n}\n
  • Added RealDistribution.clip to allow zero-inflated distribution models with controlled randomization

Breaking changes

  • Removed components from Environment and created componentCollector as optional replacement
  • Redesigned events & metrics API
  • Updated to koin v3.1 (fixes #15): GlobalContext has been replaced with DependencyContext
  • Established use of SimTime across the entire API to disambiguate simulation time instants from durations, which are still modelled as Double
  • Changed Component.nowand Environment.now to new value class SimTime for better type safety
  • Simplified ClockSync API by removing redundant speedUp parameter
  • Component.status has been renamed to Component.componentState to enable extending classes to use the property name status for domain modelling
  • Removed requirement to implement info in SimulationEntity
  • Moved stochastic distributions support API to from Component to SimulationEntity
  • Removed Component::setup because the user can just use an init{} block instead
  • Migrated release channel from jcenter to maven-central
"},{"location":"changes/#v06","title":"v0.6","text":"

Released 2021-02-12 -> Updated to v0.6.6 on 2021-05-05

Major Enhancements

  • Added selectResource() to select from resources with policy

    val doctors = List(3) { Resource() }\nval selected = selectResource( doctors, policy = ShortestQueue )\n

  • New suspending batch interaction to group an entity stream into blocks

    val queue = ComponentQueue<Customer>()\nval batchLR: List<Customer> = batch(queue, 4, timeout = 10)\n

  • Added option to configure a tick to wall time transformer

    createSimulation {\n    tickTransform = OffsetTransform(Instant.now(), DurationUnit.MINUTES)\n\n    run(Duration.ofMinutes(90).asTicks())\n    println(asSimTime(now))\n}\n

  • Added lifecycle records to streamline component state analyses

  • Changed ComponentGenerator to allow generating arbitrary types (and not just Components)

    ComponentGenerator(uniform(0,1)){ counter -> \"smthg no${counter}\"}\n

  • Added forceStart to ComponentGenerator to define if an arrival should be happen when it is activated for the first time

  • Changed scheduling priority from Int to inline class Priority (with defaults NORMAL, HIGH, LOW) in all interaction methods for more typesafe API

  • Started bundled simulations for adhoc experimentation and demonstration by adding M/M/1 queue MM1Queue

  • Added support for pluggable visualization backend. Currently kravis and lets-plot are supported. For jupyter-notebook examples mm1-queue analysis

    // simply toggle backend by package import\nimport org.kalasim.plot.letsplot.display\n// or\n//import org.kalasim.plot.kravis.display\n\nMM1Queue().apply {\n    run(100)\n    server.claimedMonitor.display()\n}\n

  • New Example: \"The ferryman\"

  • New Example: Office Tower
"},{"location":"changes/#v05","title":"v0.5","text":"

Released 2021-01-12

Major Enhancements

  • Added first jupyter notebook example
  • New depletable resource type
  • New statistical distributions API
  • New more structured event logging. See user manual
  • Implemented support for real-time simulations
  • New example Dining Philosophers
  • New example Movie Theater
  • New API to add dependencies in simulation context using dependency {}

Notable Fixes

  • Fixed failAt in request
"},{"location":"changes/#v04","title":"v0.4","text":"

Released 2021-01-03

Major Enhancements

  • Implemented interrupt interaction
  • Reworked documentation and examples
  • Implemented standby
  • Implement disable/enable for monitors
  • Yield internally, to simplify process definitions

    // before\nobject : Component() {\n    override fun process() = sequence { yield(hold(1.minutes)) }\n}\n\n// now\nobject : Component() {\n    override fun process() = sequence { hold(1.hours) }\n}\n

  • Made scheduledTime nullable: Replaced scheduledTime = Double.MAX_VALUE with null where possible to provide better mental execution model

  • Provide lambda parameter to enable auto-releasing of resources
    // before\nobject : Component() {\n    override fun process() = sequence { \n        request(r)\n        hold(1)\n        release(r)\n    }\n}\n\n// now\nobject : Component() {\n    override fun process() = sequence { \n        request(r){\n            hold(1)\n        }\n    }\n}\n
  • Implemented Environment.toString to provide json description
  • Various bug-fixes
"},{"location":"changes/#v03","title":"v0.3","text":"
  • Reimplemented monitors
  • Continued salabim core API reimplementation
  • Fixed: Decouple simulation with different koin application contxts
"},{"location":"changes/#v02","title":"v0.2","text":"
  • Reimplement core salabim examples in kotlin
  • Port all salabim examples
  • Started MkDocs manual
"},{"location":"changes/#v01","title":"v0.1","text":"
  • Reimplement salabim's main component lifecycle
  • Add timing API
"},{"location":"collections/","title":"Collections","text":"

A very common element of discrete simulation models, are queues of elements that are consumed by downstream components. A basic example would be the waiting line in a bank.

Clearly, the JVM and Kotlin provide a very rich collection API ecosystem. However, kalasim is providing its own implementations for List and Queue with ComponentList and ComponentQueue respectively, that are backed with standard implementation but add additional metrics and tracking to allow statistical analysis. If such functionality is not needed in a particular simulation model, standard collection implementation can be used as well without any restriction.

"},{"location":"collections/#queue","title":"Queue","text":"

kalasim provides an instrumented queue implementation ComponentQueue on top of the JVM's PriorityQueue to model waiting lines etc. Conceptual our implementation is very similar to salabim's queue.

A typical use case would be a generator process (material, customers, etc.) that is consumed by other components. By definition, a generator is a Component that contains at least one yield in its process definition. In the following example a generator is creating new Customers which are entering a waiting line Queue. This queue is consumed by a clerk which take one customer at a time and goes on hold for processing. See here for the complete implementation.

sequenceDiagram EventLoop->>CustomerGenerator: Continue generator process CustomerGenerator->>Customer: Create new Customer CustomerGenerator-->>EventLoop: Reschedule for later Customer->>Queue: Enter waiting line Clerk->>Queue: Pull next customer Clerk-->>EventLoop: hold vor n time units for processing Examples

  • ATM Queue
"},{"location":"collections/#comparator","title":"Comparator","text":"

By default, the ComponentQueue is sorted by priority and enter-time. To provide a custom ordering scheme, the user can supply her own comparator easily

val cq = ComponentQueue(comparator = compareBy<Patient> { it.severity })\n\n// or using a chained comparator\nval cq2 = ComponentQueue(comparator = compareBy <Patient>{ it.severity }.thenBy { it.type })\n
"},{"location":"collections/#batching","title":"Batching","text":"

Queues can be consumed in a batched manner using the batch(). See \"The Ferryman\" for a worked out example and its API documentation.

"},{"location":"collections/#list","title":"List","text":"

As alternative to the ordered queue, kalasim also provides a similarly instrumented list implementation with ComponentList. It's only providing very basic FiFo queue characteristics with poll() supported by its backend.

The main intent for ComponentList are more sophisticated use-cases that can not be modelled with a single queue. Examples are

  • Machine scheduling with more than instance
  • Service models with different

In such cases, a simple Comparator (even a chained one) are often insufficient to model the complex scheduling requirements.

"},{"location":"collections/#metrics","title":"Metrics","text":"

Both, the ComponentList and the ComponentQueue provide a similar set of built-in metrics

Monitors

  • queueLengthMonitor tracks the queue length level across time
  • lengthOfStayMonitor tracks the length of stay in the queue over time

Statistics

  • stats - Current state snapshot of queue statistics regarding length and length of stay
  • info - Json-structured summary of the list/queue
"},{"location":"collections/#capacity","title":"Capacity","text":"

Collections support a capacity and an accompanying capacityTimeline to set a maximum capacity. If this capacity is exceeded a CapacityExceededException is being thrown.

A capacity can be reduced (similar to resources) by setting a new one

val queue = ComponentQueue(capacity=5)\nqueue.capacity = 10\n

When setting a capacity that is lower than the current collection size, a CapacityExceededException is being thrown.

"},{"location":"component/","title":"Component","text":"

Components are the key elements of a simulation. By providing a process definition of the business process in study, components allow modeling the interplay with other simulation components as well as its timing.

Components can be in different lifecycle state. An ACTIVE component has one or more process definitions of which one was activated at some point earlier in time.

If a component has an associated process definition, we can schedule it for execution using activate(). This will also change its state to become active ACTIVE,

An ACTIVE component can become DATA either with a cancel() or by reaching the end of its process definition.

It is very easy to create a DATA components which can be useful to model more passive elements in a model (such as production material).

val component = Component()\n

Components will interact with each other through a well-defined vocabulary of process interaction methods.

Info

By default, Components will be named automatically, using the pattern [Class Name].[Instance Number] unless a custom name is provided via the name parameter in Component(name=\"Foo\"). Kalasim also supports auto-indexing if a provided component name ends with a dash -, dot . or underscore _. E.g. A first Component(\"Foo-\") will be named Foo-1, a second one Foo-2 and so on.

"},{"location":"component/#process-definition","title":"Process Definition","text":"

Although it is possible to create a component directly with val x = Component(), this does not encode any simulation mechanics a there is process definition defining how the x will interact with the simulation environment. So, nearly always we define our simulation entities by extending Component and by providing a process definition which details out the component's life cycle:

Important

The process definition of a component defines its dynamics and interplay with other simulation entities. Writing down the process definition is the key modelling task when using kalasim.

If there is no process definition, a component will stay passive. Techncially, it is refrerred to as a DATA component.

There are 3 supported methods to provide a process definition.

"},{"location":"component/#1-extend-process","title":"1. Extend process","text":"

Let's start with the most common method. In order to define an ACTIVE component it is necessary to extend org.kalasim.Component to provide (at least) one sequence generator method, normally called process:

class Car: Component(){\n    override fun process() = sequence {\n        wait(customerArrived)\n\n        request(driver){\n            hold(4, \"driving\")\n        }\n    }\n}\n

If we then later say val car = Car(), a component is created, and it is scheduled for execution within kalasim's event loop. The process method is nearly always, but not necessarily a generator method (i.e. it has at least one yield statement), so it contains suspension points where execution can be stalled.

It is also possible to set a time at which the component (car) becomes active, like val car = Car(delay=10). This requires an additional constructor argument to be passed on to Component as in class Car(delay:Number): Component(delay=delay).

Creation and activation are by default combined when creating a new Component instance:

val car1 = Car()\nval car2 = Car()\nval car3 = Car()\n

This causes three cars to be created and to be activated, so these instances are scheduled for execution in the simulation's event queue.

Info

In some situations, automatic activation of the process definition may not be needed or desired. If so, even in presence of a process or repeatedProcess method, you can disable the automatic activation (i.e. make it a data component), by specifying Component(process = Component::none).

Normally, any process definition will contain at least one yield statement. By doing so, the component can hand-back control to the simulation engine at defined points when a component needs to wait. Typically, the user must not use yield directly, but rather the provided process interaction methods.

"},{"location":"component/#2-extend-repeatedprocess","title":"2. Extend repeatedProcess","text":"

Another very common pattern when writing down process definitions, iteratively executed processes. This could be modelled directly as described above using process. But as shown in the following example, this lacks somewhat lacks conciseness:

class Machine : Component(){\n    override fun process() = sequence {\n        while(true) {\n          wait(hasMaterial)\n          hold(7, \"drilling\")\n        }\n    }\n}\n

Luckily, this can be expressed more elegantly with repeatedProcess:

class Machine : Component(){\n    override fun repeatedProcess() = sequence {\n        wait(hasMaterial)\n        hold(7, \"drilling\")\n    }\n}\n
"},{"location":"component/#3-process-reference","title":"3. Process Reference","text":"

A component may be initialized to start at another process definition method. This is achieved by passing a reference to this method which must be part of the component's class definition, like val car = Car(process = Car::wash).

It is also possible to prepare multiple process definition, which may become active later by means of an activate() statement:

////CraneProcess.kts\nimport org.kalasim.*\n\nclass Crane(\n    process: GeneratorFunRef? = Component::process\n) : Component(process = Crane::load) {\n    fun unload() = sequence<Component> {\n        // hold, request, wait ...\n    }\n\n    fun load() = sequence<Component> {\n        // hold, request, wait ...\n    }\n}\n\ncreateSimulation {\n    val crane1 = Crane() // load will be activated be default\n\n    val crane2 = Crane(process = Crane::load) // force unloading at start\n\n    val crane3 = Crane(process = Crane::unload) // force unloading at start\n    crane3.activate(process = Crane::load) // activate other process\n}\n

Effectively, creation and start of crane1 and crane2 is the same.

"},{"location":"component/#inlining-subprocesses","title":"Inlining Subprocesses","text":"

To run/consume/inline another process definition, we can useyieldAll(subProcess()) to inline subProcess() defined for the same component. This allows to inline the entire process definition in a blocking manner. Here's an example how to do so:

//import org.kalasim.*\nimport kotlin.time.Duration.Companion.minutes\n\ncreateSimulation {\n    enableComponentLogger()\n\n    object : Component() {\n\n        override fun process() = sequence {\n            hold(1.minute)\n            // to consume the sub-process we use yieldAll\n            yieldAll(subProcess())\n            // it will continue here after the sub-process has been consumed\n            hold(2.minutes)\n        }\n\n        fun subProcess(): Sequence<Component> = sequence {\n            hold(3.minutes)\n        }\n    }\n\n    run()\n}\n
"},{"location":"component/#toggling-processes","title":"Toggling processes","text":"

It's a very effective tool in discrete simulation, to toggle the process definition of a component at runtime. Using activate() we can toggle processes very effectively in a simulation model. There are 3 ways to do so

  1. From with a component's process defintion
  2. Within another component process defintion
  3. Outside of any process definition.

The following example illustrates these examples as well as process inlining:

////Restaurant.kts\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\ndata class Recipe(val name: String) {\n    override fun toString() = name\n}\n\nclass Customer : Component() {\n    val restaurant  = get<Restaurant>()\n\n    override fun process() = sequence<Component> {\n        hold(3.hours + 15.minutes) // arrive somewhen\n\n        restaurant.activate(process=Restaurant::cookSomething, Recipe(\"pasta\"))\n\n        hold(30.minutes,\"drink something while waiting for food\")\n\n        // wait for the food preparation to complete\n        join(restaurant)\n\n        //order something else\n        restaurant.activate(process=Restaurant::specialOffer)\n    }\n}\n\nclass Restaurant : Component() {\n\n    override fun process(): Sequence<Component> = sequence {\n        hold(2.hours, \"opening restaurant\")\n    }\n\n    fun cookSomething(recipe: Recipe) = sequence {\n        hold(10.minutes, \"preparing $recipe\")\n\n        log(\"dinner's ready! I am serving $recipe today\")\n    }\n\n    fun specialOffer(): Sequence<Component> = sequence {\n        hold(5.minutes, \"selecting dish of the day\")\n\n        // We can activate another process from within a process definition\n        // Provide a recipe, set the `spicy` flag and delay activation by 5 minutes\n        activate(::cookSomethingSpecial, Recipe(\"cake\"), true, delay = 5.minutes)\n    }\n\n    fun cookSomethingSpecial(recipe: Recipe, spicy: Boolean) = sequence {\n        hold(20.minutes, \"preparing $recipe ...\")\n\n        yieldAll(prepareDesert()) // inline sub-process\n\n        log(\"special dinner's ready!\")\n        log(\"serving ${if(spicy) \"spicy\" else \"\"} $recipe and some desert\")\n    }\n\n    // another small process without any arguments\n    fun prepareDesert() = sequence {\n        hold(15.minutes, \"making a pie\")\n    }\n}\n\ncreateSimulation {\n    enableComponentLogger()\n\n    // instantiate the simulation components\n    val restaurant = dependency { Restaurant() }\n\n    // create customer\n    Customer()\n\n    // run the model\n    run()\n\n    // activate process with arguments from outside a process definition\n    restaurant.activate(\n        process = Restaurant::cookSomething,\n        processArgument = Recipe(\"lasagne\")\n    )\n\n    // and run again\n    run()\n}\n
Notably, we can provide process arguments here in a typesafe manner.

"},{"location":"component/#lifecycle","title":"Lifecycle","text":"

A simulation component is always in one of the following states modelled by org.kalasim.ComponentState:

  • CURRENT - The component's process is currently being executed by the event queue
  • SCHEDULED - The component is scheduled for future execution
  • PASSIVE - The component is idle
  • REQUESTING - The component is waiting for a resource requirement to be met
  • WAITING - The component is waiting for a state predicate to be met
  • STANDBY - The component was put on standby
  • INTERRUPTED - The component was interrupted
  • DATA - The component is non of the active states above. Components without a process definition are always in this state.

A component's status is managed via the property component.componentState, and is automatically tracked with a level monitor named component.statusTimeline.

The statusMonitor can be consumed in different ways. It possible to check how long a component has been in a particular state with

val passiveDuration = component.statusMonitor[ComponentState.PASSIVE]\n
Also, it is possible to print a histogram with all the statuses a component has been in with

component.statusMonitor.printHistogram()\n

Accumulated times in a particular state can be obtained with summed() and be printed to console or displayed with the selected graphics backend

val timeInEachState = component.statusMonitor.summed()\n\ntimeInEachState.printConsole()\ntimeInEachState.display()\n

"},{"location":"component/#process-interaction","title":"Process Interaction","text":"

The scheme below shows how interaction relate to component state transitions:

from/to data current scheduled passive requesting waiting standby interrupted data activate1 activate current process end yield hold yield passivate yield request yield wait yield standby . yield cancel yield activate scheduled cancel next event hold passivate request wait standby interrupt . activate passive cancel activate1 activate request wait standby interrupt . hold2 requesting cancel claim honor activate3 passivate request wait standby interrupt . time out activate4 waiting cancel wait honor activate5 passivate wait wait standby interrupt . timeout activate6 standby cancel next event activate passivate request wait interrupt interrupted cancel resume7 resume7 resume7 resume7 resume7 interrupt8 . activate passivate request wait standby
  1. Via scheduled()
  2. Not recommended
  3. With keepRequest = false (default)
  4. With keepRequest = true. This allows to set a new time out
  5. With keepWait = false (default)
  6. With keepWait = true. This allows to set a new timeout
  7. State at time of interrupt
  8. Increases the interruptLevel
"},{"location":"component/#hold","title":"hold","text":"

This method is utilized to suspend a component for a specific duration of simulation time. It changes that the state of a - usually current - component to scheduled. By invoking the hold method, control is returned from the process definition back to the simulation engine. After the specified hold duration, the engine will resume the execution of the process definition. This becomes a crucial method in kalasim, as it dictates the temporal flow of the overall process.

Here's a basic example illustrating this process:

object : Component(\"Something\") {\n    override fun process() = sequence {\n        hold(10.minutes, description = \"some action\")\n        // ^^ This is telling kalasim to suspend execution of this process \n        // for 10 simulation minutes\n\n        // ... 10 minutes later ...\n        // After these 10 minutes, it will continue execution of the process\n        hold(1.minutes, description = \"some other action \")\n    }\n}\n

Supported parameters in hold() are

  • duration - The duration for which the component should be held.
  • description - An optional description for the hold operation.
  • until - The simulation time until which the component should be held. If provided, the component will be held until the specified simulation time.
  • priority - The priority of the hold operation. A higher priority value indicates a higher priority. Defaults to NORMAL.
  • urgent - A flag indicating whether the hold operation is urgent. If set to true, the component will be scheduled with the highest possible priority. Defaults to false.

Either duration or until must be specified when calling hold() to indicate the intended delay.

"},{"location":"component/#state-contract","title":"State Contract","text":"

The state contract when calling hold() is as follows

  • If the component is CURRENT, it will suspend execution internally, and the component becomes scheduled for the specified time
  • If the component to be held is passive, the component becomes scheduled for the specified time.
  • If the component to be held is scheduled, the component will be rescheduled for the specified time, thus essentially the same as activate.
  • If the component to be held is standby, the component becomes scheduled for the specified time.
  • If the component to be activated is requesting, the request will be terminated, the attribute failed set and the component will become scheduled. It is recommended to use the more versatile activate method.
  • If the component to be activated is waiting, the wait will be terminated, the attribute failed set and the component will become scheduled. It is recommended to use the more versatile activate method.
  • If the component is interrupted, the component will be activated at the specified time.
"},{"location":"component/#activate","title":"activate","text":"

activate() will schedule execution of a process definition at the specified time. If no time is specified, execution will be scheduled for the current simulation time. If you do not specify a process, the current process will be scheduled for continuation. If a process argument is provided, the process will be started (or restarted if it is equal to the currently active process).

Car() // default to process=Component::process or Component::repeatedProcess   \nCar(process=Component::none) // no process, which effectivly makes the car DATA     \n\nval car = Car(process=Car::driving) // start car in driving mode  \n\n// stop driving (if still ongoing) and activate refilling process\ncar1.activate(process=Car::refilling)\n\n// activate defined process if set, otherwise error\ncar0.activate()  \n
"},{"location":"component/#parameters","title":"Parameters","text":"

Supported parameters in activate()

  • process - The name of the process to be started. If set to None, the process will not be changed. If the component is a data component, the generator function process will be used as the default process. Optionally type safe arguments can be provided to the generator function via processArgument and otherProcessArgument
  • processArgument - The argument to be passed to the process.
  • at - The schedule time. If omitted, no delay is used.
  • delay - The delay before starting the process. It uses a Duration object to specify the delay amount. The default value is Duration.ZERO.
  • priority - The priority level of the activation. It uses the Priority enumeration with options HIGH, NORMAL, and LOW. The default value is NORMAL.
  • urgent - Indicates whether the activation is urgent or not. If set to true, the activation will be treated as urgent. The default value is false.
  • keepRequest - Indicates whether to keep the activation request even after the process is started. If set to true, the activation request will be kept. The default value is false.
  • keepWait - Indicates whether to keep waiting for the process to complete before returning. If set to true, the activation will not return until the process is complete. The default value is false.
"},{"location":"component/#state-contract_1","title":"State Contract","text":"

The state contract when calling hold() is as follows

  • If the component to be activated is DATA, unless provided with process the default Component::process will be scheduled at the specified time.
  • If the component to be activated is PASSIVE, the component will be activated at the specified time.
  • If the component to be activated is SCHEDULED, the component will get a new scheduled time.
  • If the component to be activated is REQUESTING, the request will be terminated, the attribute failed set, and the component will become scheduled. If keep_request=True is specified, only the fail_at will be updated, and the component will stay requesting.
  • If the component to be activated is WAITING, the wait will be terminated, the attribute failed set, and the component will become scheduled. If keepWait=true is specified, only the failAt will be updated, and the component will stay waiting.
  • If the component to be activated is STANDBY, the component will get a new scheduled time and become scheduled.
  • If the component is INTERRUPTED, the component will be activated at the specified time.
"},{"location":"component/#misc","title":"Misc","text":"

Important

It is not possible to activate() the CURRENT component without providing a process argument. kalasim will throw an error in this situation. The effect of a \"self\"-activate would be that the component becomes scheduled, thus this is essentially equivalent to the preferred hold method, so please use hold instead. The error is a safe-guard mechanism to prevent the user from unintentionally rescheduling the current component again.

In situations where the current process need to be restarted, we can use activate yield(activate(process = Component::process)) which will bypass the internal requirement that the activated component must not be CURRENT.

Although not very common, it is also possible to activate a component at a certain time or with a specified delay:

ship1.activate(at=100)\nship2.activate(delay=50.minutes)\n

Note

It is possible to use activate() outside of a process definition, e.g. to toggle processes after some time

sim.run(10)\ncar.activate(process=Car::repair)\nsim.run(10)\n
However, in most situations this is better modelled within a process definition.

We can use activate to toggle the active process of a component

"},{"location":"component/#passivate","title":"passivate","text":"

Passivate is the way to make a - usually current - component passive. This is essentially the same as scheduling for time=inf.

  • If the component to be passivated is CURRENT, the component becomes passive, and it will suspend execution internally.
  • If the component to be passivated is passive, the component remains passive.
  • If the component to be passivated is scheduled, the component becomes passive.
  • If the component to be held is standby, the component becomes passive.
  • If the component to be activated is requesting, the request will be terminated, the attribute failed set and the component becomes passive. It is recommended to use the more versatile activate method.
  • If the component to be activated is waiting, the wait will be terminated, the attribute failed set and the component becomes passive. It is recommended to use the more versatile activate method.
  • If the component is interrupted, the component becomes passive.
"},{"location":"component/#cancel","title":"cancel","text":"

Cancel has the effect that the component becomes a data component.

  • If the component to be cancelled is CURRENT, it will suspend execution internally.
  • If the component to be cancelled is passive, scheduled, interrupted or standby, the component becomes a data component.
  • If the component to be cancelled is requesting, the request will be terminated, the attribute failed set, and the component becomes a data component.
  • If the component to be cancelled is waiting, the wait will be terminated, the attribute failed set and the component becomes a data component.

Examples

  • Bank Office with Reneging
"},{"location":"component/#standby","title":"standby","text":"

Standby has the effect that the component will be triggered on the next simulation event.

  • If the component is CURRENT, it will suspend execution internally
  • Although theoretically possible, it is not recommended to use standby for non current components. If needed to do so, the pattern to provide the correct receiver is with(nonCurrent){ standby() }
  • Not allowed for DATA components or main

Examples

  • Bank Office with Standby
"},{"location":"component/#request","title":"request","text":"

Request has the effect that the component will check whether the requested quantity from a resource is available. It is possible to check for multiple availability of a certain quantity from several resources.

Instead of checking for all of number of resources, it is also possible to check for any of a number of resources, by setting the oneOf parameter to true.

By default, there is no limit on the time to wait for the resource(s) to become available. However, it is possible to set a time with failAt at which the condition has to be met. If that failed, the component becomes CURRENT at the given point of time. This is also known as reneging.

If the component is canceled, activated, passivated, interrupted or held the failed flag will be set as well.

  • If the component is CURRENT, it will suspend execution internally
  • Although theoretically possible it is not recommended to use request for non current components. If needed to do so, the pattern to provide the correct receiver is with(nonCurrent){ request(r) }

A component can also actively renege a pending request by calling release(resource). See Bank3ClerksRenegingResources for an example (as well as Bank3ClerksReneging Bank3ClerksRenegingState for other supported reneging modes).

"},{"location":"component/#wait","title":"wait","text":"

Wait has the effect that the component will check whether the value of a state meets a given condition. It is possible to check for multiple states. By default, there is no limit on the time to wait for the condition(s) to be met. However, it is possible to set a time with failAt at which the condition has to be met. If that failed, the component becomes CURRENT at the given point of time. The code should then check whether the wait had failed. That can be checked with the Component.failed property.

If the component is canceled, activated, passivated, interrupted or held the failed flag will be set as well.

  • If the component is CURRENT, it will suspend execution internally
  • Although theoretically possible it is not recommended to use wait for non current components. If needed to do so, the pattern to provide the correct receiver is with(nonCurrent){ wait() }

Examples

  • Gas Station

Supported parameters in wait

  • state - A state variable
  • waitFor - The state value to wait for
  • description - The description of the wait request.
  • triggerPriority - The queue priority to be used along with a state change trigger
  • failAt - If the request is not honored before fail_at, the request will be cancelled and the parameter failed will be set. If not specified, the request will not time out.
  • failDelay - If the request is not honored before now + failDelay, the request will be cancelled and the parameter failed will be set. if not specified, the request will not time out.
  • failPriority - Schedule priority of the fail event. If a component has the same time on the event list, this component is sorted according to the priority. An event with a higher priority will be scheduled first.
"},{"location":"component/#interrupt","title":"interrupt","text":"

With interrupt components that are not current or data can be temporarily be interrupted. Once a resume is called for the component, the component will continue (for scheduled with the remaining time, for waiting or requesting possibly with the remaining fail_at duration).

Examples

  • Machine Parts
"},{"location":"component/#usage-of-process-interaction-methods-within-a-function-or-method","title":"Usage of process interaction methods within a function or method","text":"

There is a way to put process interaction statement in another function or method. This requires a slightly different way than just calling the method.

As an example, let's assume that we want a method that holds a component for a number of minutes and that the time unit is actually seconds. So we need a method to wait 60 times the given parameter.

We start with a not so elegant solution:

object : Component() {\n    override fun process() = sequence<Component>{\n        hold(5.days)\n        hold(5.hours)\n    }\n}\n

Now we just add a method holdMinutes. Direct calling holdMinutes is not possible. Instead, we have to define an extension function on SequenceScope<Component>:

object : Component() {\n    override fun process() = sequence {\n        holdMinutes()\n        holdMinutes()\n    }\n\n    private suspend fun SequenceScope<Component>.holdMinutes() {\n        hold(5.minutes)\n    }\n}\n

All process interaction statements including passivate, request and wait can be used that way!

So remember if the method contains a yield statement (technically speaking iss a generator method), it should be called with from an extension function.

"},{"location":"component/#component-generator","title":"Component Generator","text":"

The creation of components is a key function of most simulations. To facilitate component creation, a ComponentGenerator can be used to create components according to a given inter arrival time (or distribution).

ComponentGenerator(iat = exponential(lambda, rg)) {\n    Customer()\n}\n

The following arguments are supported when setting up a component generator

  1. Inter arrival duration iat or distribution between history/generations.
  2. A builder named builder of type Environment.(counter: Int) -> T allows to specify how the objects of type T are generated. Thereby, counter can be used to name the objects accordingly.

There are also additional arguments available to support more custom/advanced use-cases:

  • startAt - time where the generator starts its operation. If omitted, now is used.
  • forceStart - If false (default), the first component will be generated at time = startAt + iat(). If true, the first component will be generated at startAt.
  • until - time up to which components should be generated. If omitted, no end.
  • total - (maximum) number of components to be generated.
  • name - Name of the component. If the name ends with a period (.), auto serializing will be applied.
  • priority - If a component has the same time on the event list, this component is scheduled according to the priority. An event with a higher priority will be scheduled first.
  • keepHistory - If true, i will store a reference of all generated components which can be queried with history.
  • koin - The dependency resolution context to be used to resolve the org.kalasim.Environment

Note, that the entities being created are not required to extend org.kalasim.Component, but can be in fact arbitrary types.

Usage:

////ComponentGeneratorExamples.kts\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\n\ncreateSimulation {\n\n    // example 1\n    // we can schedule with a probabilist inter-arrival distribution\n    data class Customer(val id: Int)\n\n    ComponentGenerator(uniform(5.minutes, 2.hours)) { customerNo ->\n        Customer(customerNo)\n    }\n\n    // we can also schedule with a fixed rate\n    // here we create 3 strings with fixed inter-arrival duration\n    ComponentGenerator(3.minutes, total = 3) { it }\n\n    // example 2\n    // we define a component with simplistic process definition\n    class Car() : Component() {\n        override fun process() = sequence {\n            hold(3.hours, description = \"driving\")\n        }\n    }\n\n    ComponentGenerator(exponential(3.minutes), until = now + 3.days) {\n        Car() // when creating a component it will be automatically scheduled next\n    }\n\n    // example 3 no-longer recommend:\n    // inter-arrival distribution without duration unit\n    ComponentGenerator(uniform(3, 4).minutes) { Customer(it) }\n}\n

More examples

  • Car Wash
  • Gas Station
  • ATM Queue
"},{"location":"events/","title":"Events","text":"

Every simulation includes an internal event bus to provide another way to enable connectivity between simulation components. Components can use log(event) to publish to the event bus from their process definitions.

Also, events can be used to study dynamics in a simulation model. We may want to monitor component creation, the event queue, or the interplay between simulation entities, or custom business dependent events of interest. We may want to trace which process caused an event, or which processes waited for resource. Or a model may require other custom state change events to be monitored.

"},{"location":"events/#how-to-create-an-event","title":"How to create an event?","text":"

To create a custom event type, we need to subcalss org.kalasim.Event. Events can be published to the internal event bus using log() in process definitions. Here's a simple example

import org.kalasim.*\n\nclass MyEvent(val context: String, time: SimTime) : Event(time)\n\ncreateSimulation {\n\n    object : Component(\"Something\") {\n        override fun process() = sequence<Component> {\n            //... a great history\n            log(MyEvent(\"foo\", now))\n            //... a promising future\n        }\n    }\n\n    // register to these events from the environment level\n    addEventListener<MyEvent> { println(it.context) }\n\n    run()\n}\n

In this example, we have created custom simulation event type MyEvent which stores some additional context detail about the process. This approach is very common: By using custom event types when building process models with kalasim, state changes can be consumed very selectively for analysis and visualization.

"},{"location":"events/#how-to-listen-to-events","title":"How to listen to events?","text":"

The event log can be consumed with one more multiple org.kalasim.EventListeners. The classical publish-subscribe pattern is used here. Consumers can easily route events into arbitrary sinks such as consoles, files, rest-endpoints, and databases, or perform in-place-analytics.

We can register a event handlers with addEventListener(org.kalasim.EventListener). Since an EventListener is modelled as a functional interface, the syntax is very concise and optionally supports generics:

createSimulation { \n    // register to all events\n    addEventListener{ it: MyEvent -> println(it)}\n\n    // ... or without the lambda arument just with\n    addEventListener<MyEvent>{  println(it)}\n\n    // register listener only for resource-events\n    addEventListener<ResourceEvent>{ it: ResourceEvent -> println(it)}    \n}\n

Event listener implementations typically do not want to consume all events but filter for specific types or simulation entities. This filtering can be implemented in the listener or by providing a the type of interest, when adding the listener.

"},{"location":"events/#event-collector","title":"Event Collector","text":"

A more selective monitor that will just events of a certain type is the event collector. It needs to be created before running the simulation (or from the moment when events shall be collected).

class MyEvent(time : SimTime) : Event(time)\n\n// run the sim which create many events including some MyEvents\nenv.run()\n\nval myEvents : List<MyEvent> = collect<MyEvent>()\n\n// or collect with an additional filter condition\nval myFilteredEvents :List<MyEvent> = collect<MyEvent> {\n    it.toString().startsWith(\"Foo\")\n}\n\n// e.g. save them into a csv file with krangl\nmyEvents.asDataFrame().writeCsv(File(\"my_events.csv\"))\n
This collector will have a much reduced memory footprint compared to the event log.

"},{"location":"events/#event-log","title":"Event Log","text":"

Another built-in event listener is the trace collector, which simply records all events and puts them in a list for later analysis.

For example to fetch all events in retrospect related to resource requests we could filter by the corresponding event type

////EventCollector.kts\nimport org.kalasim.*\nimport org.kalasim.analysis.*\n\ncreateSimulation {\n    enableComponentLogger()\n\n    // enable a global list that will capture all events excluding StateChangedEvent\n    val eventLog = enableEventLog(blackList = listOf(StateChangedEvent::class))\n\n    // run the simulation\n    run(5.seconds)\n\n    eventLog.filter { it is InteractionEvent && it.component?.name == \"foo\" }\n\n    val claims = eventLog //\n        .filterIsInstance<ResourceEvent>()\n        .filter { it.type == ResourceEventType.CLAIMED }\n}\n
"},{"location":"events/#asynchronous-event-consumption","title":"Asynchronous Event Consumption","text":"

Sometimes, events can not be consumed in the simulation thread, but must be processed asynchronously. To do so we could use a custom thread or we could setup a coroutines channel for log events to be consumed asynchronously. These technicalities are already internalized in addAsyncEventLister which can be parameterized with a custom coroutine scope if needed. So to consume, events asynchronously, we can do:

////LogChannelConsumerDsl.kt\nimport org.kalasim.*\nimport org.kalasim.analysis.InteractionEvent\n\ncreateSimulation {\n    ComponentGenerator(iat = constant(1).days) { Component(\"Car.${it}\") }\n\n    // add custom log consumer\n    addAsyncEventListener<InteractionEvent> { event ->\n        if(event.current?.name == \"ComponentGenerator.1\")\n            println(event)\n    }\n\n    // run the simulation\n    run(10.weeks)\n}\n

In the example, we can think of a channel as a pipe between two coroutines. For details see the great article Kotlin: Diving in to Coroutines and Channels.

"},{"location":"events/#internal-events","title":"Internal Events","text":"

kalasim is using the event-bus extensively to publish a rich set of built-int events.

  • Interactions via InteractionEvent
  • Entity creation via EntityCreatedEvent
  • Resource requests, see resource events.

To speed up simulations, internal events can be disabled.

"},{"location":"events/#component-logger","title":"Component Logger","text":"

For internal interaction events, the library provides a built-in textual logger. With component logging being enabled, kalasim will print a tabular listing of component state changes and interactions. Example:

time      current component        component                action      info                          \n--------- ------------------------ ------------------------ ----------- -----------------------------\n.00                                main                     DATA        create\n.00       main\n.00                                Car.1                    DATA        create\n.00                                Car.1                    DATA        activate\n.00                                main                     CURRENT     run +5.0\n.00       Car.1\n.00                                Car.1                    CURRENT     hold +1.0\n1.00                               Car.1                    CURRENT\n1.00                               Car.1                    DATA        ended\n5.00      main\nProcess finished with exit code 0\n

Console logging is not active by default as it would considerably slow down larger simulations. It can be enabled when creating a simulation.

createSimuation(enableComponentLogger = true){\n    // some great sim in here!!\n}\n

Note

The user can change the width of individual columns with ConsoleTraceLogger.setColumnWidth()

"},{"location":"events/#bus-metrics","title":"Bus Metrics","text":"

By creating a BusMetrics within a simulation environment, log statistics (load & distribution) are computed and logged to the bus.

createSimulation{\n    BusMetrics(\n        timelineInterval = 3.seconds,\n        walltimeInterval =  20.seconds\n    )    \n}\n
Here, every 3 seconds in simulation time, the event rate is logged. Additionally, every 20 walltime second, the event rate is logged asynchronously.

Metrics are logged via slf4j. The async logging can be stopped via busMetrics.stop().

"},{"location":"events/#logging-framework-support","title":"Logging Framework Support","text":"

kalasim is using slf4j as logging abstraction layer. So, it's very easy to also log kalasim events via another logging library such as log4j, https://logging.apache.org/log4j/2.x/, kotlin-logging or the jdk-bundled util-logger. This is how it works:

////LoggingAdapter.kts\nimport org.kalasim.examples.er.EmergencyRoom\nimport java.util.logging.Logger\nimport kotlin.time.Duration.Companion.days\n\n// Create a simulation of an emergency room\nval er = EmergencyRoom()\n\n// Add a custom event handler to forward events to the used logging library\ner.addEventListener { event ->\n    // resolve the event type to a dedicated logger to allow fine-grained control\n    val logger = Logger.getLogger(event::class.java.name)\n\n    logger.info { event.toString() }\n}\n\n// Run the model for 100 days\ner.run(100.days)\n

For an in-depth logging framework support discussion see #40.

"},{"location":"events/#tabular-interface","title":"Tabular Interface","text":"

A typesafe data-structure is usually the preferred for modelling. However, accessing data in a tabular format can also be helpful to enable statistical analyses. Enabled by krangl's Iterable<T>.asDataFrame() extension, we can transform records, events and simulation entities easily into tables. This also provides a semantic compatibility layer with other DES engines (such as simmer), that are centered around tables for model analysis.

We can apply such a transformation simulation Events. For example, we can apply an instance filter to the recorded log to extract only log records relating to resource requests. These can be transformed and converted to a csv with just:

// ... add your simulation here ...\ndata class RequestRecord(val requester: String, val timestamp: Double, \n            val resource: String, val quantity: Double)\n\nval tc = sim.get<TraceCollector>()\nval requests = tc.filterIsInstance<ResourceEvent>().map {\n    val amountDirected = (if(it.type == ResourceEventType.RELEASED) -1 else 1) * it.amount\n    RequestRecord(it.requester.name, it.time, it.resource.name, amountDirected)\n}\n\n// transform data into data-frame (for visualization and stats)  \nrequests.asDataFrame().writeCSV(\"requests.csv\")\n

The transformation step is optional, List<Event> can be transformed asDataFrame() directly.

"},{"location":"events/#events-in-jupyter","title":"Events in Jupyter","text":"

When working with jupyter, we can harvest the kernel's built-in rendering capabilities to render events. Note that we need to filter for specific event type to capture all attributes.

For a fully worked out example see one of the example notebooks .

"},{"location":"examples/","title":"Overview","text":"

There's nothing more intriguing than a good example. To provide guidance we tried to categorize our examples by difficulty. Categorization is opinionated and just tries to pave an entry path into kalasim API.

Simple

  • Car - A single car, a driver, and red traffic light in the middle of the night. The thrilling landing page example but this time fully documented with an extensive code-walkthrough.
  • Traffic - Car navigate through a simple traffic model with crossings and traffic-lights. Clearly, they need to refill, but there is just a limited number of slots as the gas station.
  • Bank Office with 1 clerk - A classic queue, where customers arrive at a bank and need to be serviced
  • Bridge Game - A survival analysis of murderous game in Netflix' famous Squid Games series.

Moderate

  • Movie Theater - A big cinema, great movies. How long does it take before tickets are sold out?
  • Car Wash - A car wash with limited throughput, and a continuous stream of new customers
  • Machine Parts - A small shop-floor with multi-part machines, where all parts must be functional to avoid tool downtime
  • Machine Shop - A day in a life of a busy maintenance engineer. Tools break and need to be repaired before they can continue operation
  • The Ferryman - A wild river, one boat only, and a patient ferryman transporting batches of passengers across the body of water

Elaborate

  • ATM - The canonical queue model. Here, illustrated with a cash machine that needs to serve customers.
  • Gas Station - A gas-station again, but this time the focus is on the station itself and how it struggls to get new petrol to serve hungry customers.
  • Bank Office - A classical queue problem where customers need to be served. Here solved 4 times in different ways using different kalasim models.
  • Dining Philosophers - Philosophers sit at a round table with bowls of spaghetti and try to eat. It ain't easy...
  • Office Tower - A busy office building, where workers need to get from floor to floor using a limited number of elevators.
  • Call Center - A support center sizing analysis to figure the correct number of support technicians before failing the business in real life.
"},{"location":"faq/","title":"F.A.Q.","text":""},{"location":"faq/#why-rebuilding-salabim","title":"Why rebuilding salabim?","text":"

Great question! Initial development was driven by curiosity about the salabim internals. Also, it lacked (arguably) a modern API touch which made some of our use cases more tricky to implement.

kalasim implements all major features of salabim as documented under https://www.salabim.org/manual/.

"},{"location":"faq/#what-tf-is-the-meaning-of-kalasim","title":"What (TF) is the meaning of kalasim?","text":"

We went through multiple iterations to come up with this great name:

  1. desimuk - {d}iscrete {e}vent {simu}lation with {k}otlin seemed a very natural and great fit. Unfortunately, Google seemed more convinced - for reasons that were outside the scope of this project - that this name related mostly with indian porn.
  2. desim - seemed fine initially, until we discovered another simulation engine https://github.com/aybabtme/desim with the same name.
  3. kalasim honors its origin by being somewhat phonetically similar to salabim while stressing Kotlin with the k, and the simulation scope with the sim instead of the bim.

In case you also wonder why salabim was named salabim, see here.

"},{"location":"faq/#can-we-use-it-with-from-java","title":"Can we use it with from Java?","text":"

Kotlin-2-Java interop is a core design goal of Kotlin. Thus, kalasim should work without any issues from java. However, we have not tried yet, so in case you struggle please file a ticket.

"},{"location":"faq/#why-can-we-use-resourcerequest1","title":"Why can we use resource.request(1)?","text":"

Admittedly, the provided resource request syntax request(resource) feels a bit dated. It's designed in that way because we would need multiple receiver support for extensions functions to provide a more object-oriented API. However, extensions with multiple receivers are not (yet) supported by Kotlin.

"},{"location":"faq/#how-to-fix-simulation-environment-context-is-missing-error","title":"How to fix Simulation environment context is missing error?","text":"

You would need to create a simulation context before instantiating the resources, components or states. E.g. with

Environment().apply{\n    val devices = Resource(name = \"devices\", capacity = 3)\n}\n

For more details regarding koin and dependency injection see https://www.kalasim.org/basics/#dependency-injection

"},{"location":"getting_started/","title":"How to get started with kalasim?","text":"

Depending on your prior experience with simulation and programming, it may take time to become fluent with kalasim.

To streamline the learning experience, we've organized our learning process suggestions by audience.

"},{"location":"getting_started/#i-have-experience-with-simulation","title":"I have experience with simulation","text":"
  1. Start by doing a crash course to learn some kotlin programming basics
  2. Run the provided simulation examples Simple Traffic and Extended Traffic in your browser (powered by datalore)
  3. Pick your favorite example and try converting it into a datalore notebook
  4. Try visualizing some metrics using the built-in visualization methods
"},{"location":"getting_started/#i-have-experience-with-programming","title":"I have experience with programming","text":"
  1. Download the community edition of Intellij IDEA
  2. Follow the instructions to create a Kotlin application
  3. Add kalasim as a dependency as described in the setup
  4. Understand the fundamentals of simulation and the main simulation entities
  5. Pick you favorite example and work it out towards your own interest/use-cases
"},{"location":"getting_started/#get-in-touch","title":"Get in touch","text":"

Feel welcome to get in touch with us for support, consulting and discussion.

"},{"location":"monitors/","title":"Monitors","text":"

Monitors are a built-in mechanism of kalasim to collect data from a simulation. Monitors collect metrics automatically for resources, components, states and collections. On top of that the user can define her own monitors.

Monitors allow to capture and visualize the dynamics of a simulation model. There are two types of monitors:

  • Level monitors are useful to collect data about a variable that keeps its value over a certain length of time, such as the length of a queue or the color of a traffic light.
  • Value monitors are useful to collect distributional statistics without a time-dimension. Examples, are the length of stay in a queue, or the number of processing steps of a part.

For both types, the time is always collected, along with the value.

Monitors support a wide range of statistical properties via m.statistics() including

  • mean
  • median
  • percentiles
  • min and max
  • standard deviation
  • histograms

For all these statistics, it is possible to exclude zero entries, e.g. m.statistics(statistics=true) returns the mean, excluding zero entries.

Monitors can be disabled with disable() by setting the boolean flag ``.

m.disable()  // disable monitoring\n\nm.reset()              // reenable statistics monitoring\nm.reset(initialValue)   // reenable level monitoring\n

Continuation of a temporarily disabled monitor is currently not supported.

"},{"location":"monitors/#value-monitors","title":"Value Monitors","text":"

Non-level monitors collects values which do not reflect a level, e.g. the processing time of a part.

There are 2 implementations to support categorical and numerical attributes

  • org.kalasim.NumericStatisticMonitor
  • org.kalasim.FrequencyMonitor

Besides, it is possible to get all collected values as list with m.statistics().values.

Calling m.reset() will clear all collected values.

"},{"location":"monitors/#level-monitors","title":"Level Monitors","text":"

Level monitors tally levels along with the current (simulation) time. E.g. the number of parts a machine is working on.

There are 2 implementations to support categorical and numerical attributes

  • org.kalasim.CategoryTimeline
  • org.kalasim.MetricTimeline

Level monitors allow to query the value at a specific time

val nlm = MetricTimeline()\n// ... collecting some data ...\nnlm[4]  // will query the value at time 4\n\nnlm[now] // will query the current value \n

In addition to standard statistics, level monitors support the following statistics

  • duration

For all statistics, it is possible to exclude zero entries, e.g. m.statistics(excludeZeros=true).mean returns the mean, excluding zero entries.

Calling m.reset() will clear all tallied values and timestamps.

The statistics of a level monitor can be printed with m.printStatistics().

"},{"location":"monitors/#histograms","title":"Histograms","text":"

The statistics of a monitor can be printed with printStatistics(). E.g: waitingLine.lengthOfStayMonitor.printStatistics():

{\n    \"all\": {\n      \"entries\": 5,\n      \"ninety_pct_quantile\": 4.142020545932034,\n      \"median\": 1.836,\n      \"mean\": 1.211,\n      \"ninetyfive_pct_quantile\": 4.142020545932034,\n      \"standard_deviation\": 1.836\n    },\n    \"excl_zeros\": {\n      \"entries\": 2,\n      \"ninety_pct_quantile\": 4.142020545932034,\n      \"median\": 1.576,\n      \"mean\": 3.027,\n      \"ninetyfive_pct_quantile\": 4.142020545932034,\n      \"standard_deviation\": 1.576\n    }\n}\n

And, a histogram can be printed with printHistogram(). E.g. waitingLine.lengthOfStayMonitor.printHistogram():

Histogram of: 'Available quantity of fuel_pump'\n              bin | entries |  pct |                                         \n[146.45, 151.81]  |       1 |  .33 | *************                           \n[151.81, 157.16]  |       0 |  .00 |                                         \n[157.16, 162.52]  |       0 |  .00 |                                         \n[162.52, 167.87]  |       0 |  .00 |                                         \n[167.87, 173.23]  |       1 |  .33 | *************                           \n[173.23, 178.58]  |       0 |  .00 |                                         \n[178.58, 183.94]  |       0 |  .00 |                                         \n[183.94, 189.29]  |       0 |  .00 |                                         \n[189.29, 194.65]  |       0 |  .00 |                                         \n[194.65, 200.00]  |       1 |  .33 | *************    \n

If neither binCount, nor lowerBound nor upperBound are specified, the histogram will be autoscaled.

Histograms can be printed with their values, instead of bins. This is particularly useful for non numeric tallied values, such as names::

val m = FrequencyMonitor<Car>()\n\nm.addValue(AUDI)\nm.addValue(AUDI)\nm.addValue(VW)\nrepeat(4) { m. addValue(PORSCHE)}\n\nm.printHistogram()\n

The output of this:

Summary of: 'FrequencyMonitor.2'\n# Records: 7\n# Levels: 3\n\nHistogram of: 'FrequencyMonitor.2'\n              bin | entries |  pct |                                         \nAUDI              |       2 |  .29 | ***********                             \nVW                |       1 |  .14 | ******                                  \nPORSCHE           |       4 |  .57 | ***********************           \n

It is also possible to specify the values to be shown:

m.printHistogram(values = listOf(AUDI, TOYOTA)) \n

This results in a further aggregated histogram view where non-selected values are agregated and listes values are forced in the display even if they were not observed.

Summary of: 'FrequencyMonitor.1'\n# Records: 7\n# Levels: 3\n\nHistogram of: 'FrequencyMonitor.1'\n              bin | entries |  pct |                                         \nAUDI              |       2 |  .29 | ***********                             \nTOYOTA            |       0 |  .00 |                                         \nrest              |       5 |  .71 | *****************************\n

It is also possible to sort the histogram on the weight (or number of entries) of the value:

m.printHistogram(sortByWeight = true)\n

The output of this:

Summary of: 'FrequencyMonitor.1'\n# Records: 7\n# Levels: 3\n\nHistogram of: 'FrequencyMonitor.1'\n              bin | entries |  pct |                                         \nPORSCHE           |       4 |  .57 | ***********************                 \nAUDI              |       2 |  .29 | ***********                             \nVW                |       1 |  .14 | ******\n

For numeric monitors it is possible to show values instead of ranges as bins

val nlm = MetricTimeline()\n\nnow += 2\nnlm.addValue(2)\n\nnow += 2\nnlm.addValue(6)\nnow += 4\n\nnlm.printHistogram(valueBins = false)\nnlm.printHistogram(valueBins = true)\n

which will result by default in

Histogram of: 'MetricTimeline.1'\n              bin | entries |  pct |                                         \n[.00, .60]        |     232 |  .23 | *********                               \n[.60, 1.20]       |       0 |  .00 |                                         \n[1.20, 1.80]      |       0 |  .00 |                                         \n[1.80, 2.40]      |     233 |  .23 | *********                               \n[2.40, 3.00]      |       0 |  .00 |                                         \n[3.00, 3.60]      |       0 |  .00 |                                         \n[3.60, 4.20]      |       0 |  .00 |                                         \n[4.20, 4.80]      |       0 |  .00 |                                         \n[4.80, 5.40]      |       0 |  .00 |                                         \n[5.40, 6.00]      |     535 |  .54 | *********************                   \n
However, when valueBins is enabled the histogram becomes

Histogram of: 'MetricTimeline.1'\n              bin | entries |  pct |                                         \n0.0               |       2 |  .25 | **********                              \n2.0               |       2 |  .25 | **********                              \n6.0               |       4 |  .50 | ********************\n
"},{"location":"monitors/#monitors-arithmetics","title":"Monitors Arithmetics","text":"

It is possible to merge the metric timeline monitors

val mtA = MetricTimeline()\nval mtB = MetricTimeline()\n\n// we can do all types of arithmetics\nmtA + mtB\nmtA - mtB\nmtA / mtB\nmtA * mtB\n\n// or work out their average over time\nlistOf(mtA, mtB).mean()\n

It is also possible to merge the resulting statistics of multiple monitors

val flmA = CategoryTimeline(1)\nval flmB = CategoryTimeline(2)\n\n// ... run simulation \n\nval mergedStats: EnumeratedDistribution<Int> = listOf(flmA, flmB).mergeStats()\n

See MergeMonitorTests for more examples regarding the other monitor types.

"},{"location":"monitors/#slicing-of-monitors","title":"Slicing of monitors","text":"

Note: Slicing of monitors as in salabim is not yet supported. If needed please file a ticket.

Use-cases for slicing are

  • to get statistics on a monitor with respect to a given time period, most likely a subrun
  • to get statistics on a monitor with respect to a recurring time period, like hour 0-1, hour 0-2, etc.
"},{"location":"monitors/#summarizing-a-monitor","title":"Summarizing a monitor","text":"

Monitor.statistics() returns a 'frozen' monitor that can be used to store the results not depending on the current environment. This is particularly useful for persisting monitor statistics for later analysis.

"},{"location":"monitors/#visualization","title":"Visualization","text":"

It is possible to render monitors with the following extension functions

NumericStatisticMonitor.display() \nMetricTimeline.display()\n

In particular multiple outputs are supported here by the underlying kravis visualization windows, which allows forward backward navigation (via the arrow buttons). See org.kalasim.examples.bank.resources.Bank3ClerksResources for an example where multiple visualizing are combined to inspect the internal state of the simulation.

Note that, currently monitor visualization just works in retrospect, and it is not (yet) possible to view the progression while a simulation is still running.

"},{"location":"resource/","title":"Resources","text":"

Resources are a powerful way of process interaction. Next to process definitions, resources are usually the most important elements of a simulation. Resources allow modeling rate-limits which are omnipresent in every business process.

A resource has always a capacity (which can be zero and even negative). This capacity will be specified at time of creation, but can be changed later with r.capacity = newCapacity. Note that this may lead to requesting components to be honored if possible.

There are two of types resources:

  • Claimable resources, where each claim is associated with a component (the claimer). It is not necessary that the claimed quantities are integer.
  • Depletable resources, where only the claimed quantity is registered. This is most useful for dealing with levels, lengths, etc.
"},{"location":"resource/#claimable-resources","title":"Claimable Resources","text":"

Claimable resources are declared with:

val clerks = Resource(\"clerks\", capacity = 3)\n

Claimable resources have several attributes to query their status

clerks.claimed // currently claimed quantity\nclerks.available // currently available quantity\n\nclerks.capacity // current capacity\n\nclerks.occupancy // calculated by claimedQuantity / capacity\n\nclerks.requesters  // components currently requesting it \nclerks.claimers // components currently claiming it \n
All these attributes are read-only, except for the capacity of the resource, which can be adjusted dynamically

clerks.capacity  = 3 // set capacity to 3\n

Any component can request from a resource in its process method. The user must not use request outside of a component's process definition.

request has the effect that the component will check whether the requested quantity from a resource is available. It is possible to check for multiple availability of a certain quantity from several resources.

Claimable resources have a queue called requesters containing all components trying to claim from the resource. In addition, there is a list claimers containing all components claiming from the resource. Both queues can not be modified but are very useful for analysis.

Notes

  • request is not allowed for data components or main.
  • If to be used for the current component (which will be nearly always the case), use yield (request(...)).
  • If the same resource is specified more that once, the quantities are summed.
  • The requested quantity may exceed the current capacity of a resource.
  • The parameter failed will be reset by a calling request or wait.

Some Examples

  • Bank Office with Resources
  • Car Wash
  • Traffic
  • Gas Station
"},{"location":"resource/#depletable-resources","title":"Depletable Resources","text":"

For depletable (which are also sometimes referred to as anonymous) resources, it may be not allowed to exceed the capacity and have a component wait for enough (claimed) capacity to be available. That may be accomplished by using a negative quantity in the Component.request() call. However, to clarify the semantics of resource depletion, the API includes a dedicated DepletableResource.

  • A depletable resource can be consumed with Component.take().
  • A depletable resource can refilled/recharged with Component.put().

Info

Both put() and take are just typesafe wrappers around request(). With put() quantities of resources are negated before calling Component.request() internally.

To create a depletable resource we do

val tank = DepletableResource(capacity = 10, initialLevel = 3)\n

We can declare its maximum capacity and its initial fill level. The latter is optional and defaults to the capacity of the resource.

In addition to the Resource attributes, depletable resources have the following attributes to streamline model building

  • level - Indicates the current level of the resource
  • isDepleted - Indicates if depletable resource is depleted (level==0)
  • isFull - Indicates if depletable resource is at full capacity

The model below illustrates the use of take and put. See the Gas Station simulation for a living example.

Examples using depletable resources * Shipyard * Lunar Mining which models deposits as depletable resource * Gas Station where the central fuel storage is modeled as depletable resource

"},{"location":"resource/#request-scope","title":"Request Scope","text":"

The recommended request usage pattern for resources is the request scope which

  1. requests a resource,
  2. executes some action,
  3. and finally releases the claimed resources.
request(clerks) { //1\n    hold(1, description = \"doing something\") //2\n} //3\n

In the example, kalasim will release the clerks automatically at the end of the request scope.

When requesting from a single resource in a nested way, claims are merged.

"},{"location":"resource/#unscoped-usage","title":"Unscoped Usage","text":"

The user can omit the request scope (not recommended and mostly not needed), and release claimed resources with release().

request(clerks)\n\nhold(1, description = \"doing something\")\n\nrelease(clerks) \n

Typically, this is only needed when releasing a defined quantity (other than the default quantity 1) from a resource with c.release(), e.g.

customer.release(clerks)  // releases all claimed quantity from r\ncustomer.release(clerks, 2)  // release quantity 2 from r\n

After a release, all other requesting components will be checked whether their claims can be honored.

"},{"location":"resource/#quantity","title":"Quantity","text":"

Some requests may request more than 1 unit from a resource. The number of requested resource units is called request quantity. Quantities are strictly positive, and kalasim also supports non-integer quantities. To request more than one unit from a resource, the user can use the follow API:

// request 1 from clerks \nrequest(clerks)\n\n// request 2 elements from clerks\nrequest(clerks, quantity = 2)\n\n// also, an infix version is supported\nrequest(clerks withQuantity 2)\n\n\n// request can be decimals\nrequest(clerks, quantity = 1.234)\n\n// quantities must be positive. This will FAIL with an error\nrequest(clerks, quantity = -3) // will throw exception!\n
"},{"location":"resource/#request-honor-policies","title":"Request Honor Policies","text":"

When requesting, it may (and will) happen that a resource is currently fully claimed, and the request can not be honored right away. Requests may even queue up, if a resource is under more demand than it can serve. To resolve competing requests in an orderly fashion, kalasim supports different honor policies. An honor policy defines the order in which competing requests are honored.

Honor policies are applied to both claimable and also depletable resources.

Policy implementations extend org.kalasim.RequestHonorPolicy.The following policies are supported:

  • Strict first come, first serve (StrictFCFS, default). This policy will honor request in order of appearance. So, it actually will wait to honor \"big\" requests, even if smaller requests that could be honored already are queueing up already. This is the default policy in kalasim, as we assume this being the most intuitive behavior in most situations.
  • Relaxed first come, first serve (RelaxedFCFS): This policy will honor claimable requests first. It will honor small requests even if larger requests are already waiting longer in line. FCFS is used as secondary order scheme in situations where multiple concurrent requests of the same quantity are waiting in line.
  • Smallest Quantity First (SQF) This policy tries to maximize \"customer\" throughput. Also this policy will fall back to an FCFS to resolve ambiguities. It will maximize the total number of requests being honored, whereas large requests may need to wait for a long time. For depletable resources, just imagine a resource that is constantly low on supply. When new supply becomes available, the resource could serve as many requesters as possible. Also, for regular resources this concept applies, e.g. in customer support, where customers require one or multiple mechanics, and the company decides to serve the least staffing-intense requests first.
  • Weighted FCFS (WeightedFCSC): Here the user can supply a weight \u03b1 that is used to compute an ordering based on \u03b1 * time_since_insert / quantity. This will progressively weigh the time since the request against request quantity. The policy will prefer smaller requests, but will ensure that also larger request are finally be honored.
  • Random Order (RandomOrder): This honor policy will honor requests in a random order. Sometimes real world processes lack a structured policy to resolve concurrent demand, so it may help understanding the current situation, before working out a better planning strategy.

As of now, the user can not provide custom RequestHonorPolicy implementations. To realize more sophisticated resource request regimes, she must implement their business specific request mechanism separately.

Important

Priorities always take precedence over the honor policy set for a resource. If a user sets a request priority, it will be respected first. That is, it does always try honoring by priority first, and only once all requests at the highest priority level are honored, it will climb down the ladder. Within a priority-level the selected honor policy is applied.

Note

A SQF policy could also be realized by using the negated quantity as request priority. However, for sake of clarity is recommended to use priorities to actually reflect business/domain needs, and use the provided SQL as baseline policy.

"},{"location":"resource/#request-priority","title":"Request Priority","text":"

As multiple components may request the same resource, it is important to prioritize requests. This is possible by providing a request priority

request(clerks, priority = IMPORTANT)\n\n// or equivalently using the dsl-request-builder syntax\nrequest(clerks withPriority IMPORTANT) \n

Irrespective of the used honor policy, kalasim will always honor requests on a resource sorted by priority.

There are different predefined priorities which correspond to the following sort-levels

  • LOWEST (-20)
  • LOW (-10)
  • NORMAL (0, Default)
  • IMPORTANT (10)
  • CRITICAL (20)

The user can also create more fine-grained priorities with Priority(23)

"},{"location":"resource/#capacity-limit-modes","title":"Capacity Limit Modes","text":"

It may happen that request() (regular resources), take() or put() (depletable resources) would fail because the request quantity exceeds a resource's capacity. A CapacityLimitMode can be configured to handle such situations gracefully:

  1. FAIL- Fail with a CapacityLimitException if request size exceeds resource capacity. (Default)
  2. SCHEDULE - Schedule request even the current capacity won't ever honor the request, hoping for a later capacity increase.
  3. CAP - Depletable resources also support capping put requests at capacity level
"},{"location":"resource/#multiple-resources","title":"Multiple resources","text":"

It is also possible to request for more resources at once. To enable this functionality in a typed manner, we provide a small builder API containing withPriority, withQuantity, and andPriority. In the following examples, we request 1 quantity from clerks AND 2 quantities from assistance.

request(\n    fireBrigade withQuantity 10,\n    ambulance withPriority IMPORTANT,\n    police withQuantity 3 andPriority IMPORTANT\n) \n

Another method to query from a pool of resources are group requests. These are simply achieved by grouping resources in a List before requesting from it using oneOf=true.

//// ResourceGroups.kts\nimport org.kalasim.Component\nimport org.kalasim.Resource\nimport kotlin.time.Duration.Companion.minutes\n\nval drMeier = Resource()\nval drSchreier = Resource()\n\nval doctors: List<Resource> = listOf(drMeier, drSchreier)\n\nobject : Component() {\n    override fun process() = sequence {\n        request(doctors, oneOf = true) {\n            hold(5.minutes, \"first aid\")\n        }\n\n        // the patient needs brain surgery, only Dr Meier can do that\n        request(drMeier) {\n            hold(10.minutes, \"brain surgery\")\n        }\n    }\n}\n

Typical use cases are staff models, where certain colleagues have similar but not identical qualification. In case of the same qualification, a single resource with a capacity equal to the staff size, would be usually the better/correct solution.

"},{"location":"resource/#resource-selection","title":"Resource Selection","text":"

To request alternative resources, the user can set the parameter request(r1, r2 withQuantity 3, oneOf=true), which will would result in requesting 1 quantity from r1 OR 3 quantities from r2. With oneOf=true, we express to the simulation engine, that fulfilling one claim only is sufficient.

To also enable more controlled resource selection scenarios, there is a special mechanism to select resources dynamically. With selectResource() a resource can be selected from a list of resources using a policy. There are several policies provided via ResourceSelectionPolicy:

  • ShortestQueue: The resource with the shortest queue, i.e. the least busy resource is selected.
  • RoundRobin: Resources will be selected in a cyclical order.
  • FirstAvailable: The first available resource is selected.
  • RandomAvailable: An available resource is randomly selected.
  • Random: A resource is randomly selected.

The RandomAvailable and FirstAvailable policies check for resource availability i.e. whether the current capacity is sufficient to honor the requested quantity (defaulting to 1). Resources that do not meet this requirement will not be considered for selection. When using these policies, an error will be raised if all resources are unavailable.

Warning

With selectResource, a resource will be only selected. It won't actually request it.

Example

////ResourceSelection.kts\nimport org.kalasim.*\nimport org.kalasim.ResourceSelectionPolicy.ShortestQueue\n\ncreateSimulation {\n    enableComponentLogger()\n\n    val doctors = List(3) { Resource() }\n\n    class Patient : Component() {\n        override fun process() = sequence {\n            val requiredQuantity = 3\n\n            val selected = selectResource(\n                doctors,\n                quantity = requiredQuantity,\n                policy = ShortestQueue\n            )\n\n            request(selected withQuantity requiredQuantity) {\n                hold(10)\n            }\n        }\n    }\n\n    ComponentGenerator(exponential(1).minutes) { Patient() }\n    run(100)\n}\n

An alternative more direct approach to achieve round-robin resource selection (e.g. for nested calls) could also be implemented (example) with an iterator.

"},{"location":"resource/#events","title":"Events","text":"

Resources will log all changes with 2 event types

"},{"location":"resource/#resource-event","title":"Resource Event","text":"

Events of type org.kalasim.ResourceEvent will indicate changes as they occur. The following fields are included in each event

  • requestId: Long - A unique id, that allows to trace requests in time
  • time: SimTime
  • curComponent: Component?
  • requester: SimulationEntity
  • resource: Resource
  • type: ResourceEventType - Either REQUESTED, CLAIMED, RELEASED, PUT or TAKE.
  • quantity: Double
"},{"location":"resource/#resource-activity-event","title":"Resource Activity Event","text":"

Events of type org.kalasim.ResourceActivityEvent will be logged at the end of a scoped request block. The following fields are included in each event

  • requested: SimTime
  • honored: SimTime
  • released: SimTime
  • requester: Component
  • resource: Resource
  • activity: String
  • quantity: Double
"},{"location":"resource/#activity-log","title":"Activity Log","text":"

Resources have a activities attribute that provides a history of scoped requests as a List<ResourceActivityEvent>

r1.activities\n    .plot(y = { resource.name }, yend = { resource.name }, x = { start }, xend = { end }, color = { activity })\n    .geomSegment(size = 10.0)\n    .yLabel(\"Resource\")\n

This visualization is also provided by a built-in display() extension for the activity log.

There's also a notebook with a complete example.

"},{"location":"resource/#timeline","title":"Timeline","text":"

The timeline attribute of a resource reports the progression of all its major metrics. The timeline provides a changelog of a resource in terms of:

  • claimed capacity
  • capacity of the resource
  • availability of the resource
  • occupancy of the resource
  • # requesters in the queue of the resource at a given time
  • # claimers claiming from the resource at a given time

For convenience also 2 inferrable attributes are also included:

  • availability
  • occupancy

Technically, the timeline is a List<ResourceTimelineSegment> that covers the entire lifespan of the resource as step functions per metric.

Example (from example notebook) that illustrates how the timeline can be used to visualize some aspects of the resource utilization over time.

r.timeline\n    .filter { listOf(ResourceMetric.Capacity, ResourceMetric.Claimed).contains(it.metric) }\n    .plot(x = { start }, y = { value }, color = { metric })\n    .geomStep()\n    .facetWrap(\"color\", ncol = 1, scales = FacetScales.free_y)\n

This visualization is also provided by a built-in display() extension for the timeline attribute.

"},{"location":"resource/#monitors","title":"Monitors","text":"

Resources have a number of monitors:

  • claimers
    • queueLength
    • lengthOfStay
  • requesters
    • queueLength
    • lengthOfStay
  • claimedTimeline
  • availabilityTimeline
  • capacityTimeline
  • occupancyTimeline (= claimed quantity / capacity)

By default, all monitors are enabled.

With r.printStatistics() the key statistics of these all monitors are printed. E.g.

{\n  \"availableQuantity\": {\n    \"duration\": 3000,\n    \"min\": 0,\n    \"max\": 3,\n    \"mean\": 0.115,\n    \"standard_deviation\": 0.332\n  },\n  \"claimedQuantity\": {\n    \"duration\": 3000,\n    \"min\": 0,\n    \"max\": 3,\n    \"mean\": 2.885,\n    \"standard_deviation\": 0.332\n  },\n  \"occupancy\": {\n    \"duration\": 3000,\n    \"min\": 0,\n    \"max\": 1,\n    \"mean\": 0.962,\n    \"standard_deviation\": 0.111\n  },\n  \"name\": \"clerks\",\n  \"requesterStats\": {\n    \"queue_length\": {\n      \"all\": {\n        \"duration\": 3000,\n        \"min\": 0,\n        \"max\": 3,\n        \"mean\": 0.564,\n        \"standard_deviation\": 0.727\n      },\n      \"excl_zeros\": {\n        \"duration\": 1283.1906989415463,\n        \"min\": 1,\n        \"max\": 3,\n        \"mean\": 1.319,\n        \"standard_deviation\": 0.49\n      }\n    },\n    \"name\": \"requesters of clerks\",\n    \"length_of_stay\": {\n      \"all\": {\n        \"entries\": 290,\n        \"ninety_pct_quantile\": 15.336764014133065,\n        \"median\": 6.97,\n        \"mean\": 5.771,\n        \"ninetyfive_pct_quantile\": 17.9504616361896,\n        \"standard_deviation\": 6.97\n      },\n      \"excl_zeros\": {\n        \"entries\": 205,\n        \"ninety_pct_quantile\": 17.074664209460025,\n        \"median\": 7.014,\n        \"mean\": 8.163,\n        \"ninetyfive_pct_quantile\": 19.28443602612993,\n        \"standard_deviation\": 7.014\n      }\n    },\n    \"type\": \"QueueStatistics\"\n  },\n  \"type\": \"ResourceStatistics\",\n  \"timestamp\": 3000,\n  \"claimerStats\": {\n    \"queue_length\": {\n      \"all\": {\n        \"duration\": 3000,\n        \"min\": 0,\n        \"max\": 3,\n        \"mean\": 2.885,\n        \"standard_deviation\": 0.332\n      },\n      \"excl_zeros\": {\n        \"duration\": 3000,\n        \"min\": 1,\n        \"max\": 3,\n        \"mean\": 2.885,\n        \"standard_deviation\": 0.332\n      }\n    },\n    \"name\": \"claimers of clerks\",\n    \"length_of_stay\": {\n      \"all\": {\n        \"entries\": 287,\n        \"ninety_pct_quantile\": 30,\n        \"median\": 0,\n        \"mean\": 30,\n        \"ninetyfive_pct_quantile\": 30,\n        \"standard_deviation\": 0\n      },\n      \"excl_zeros\": {\n        \"entries\": 287,\n        \"ninety_pct_quantile\": 30,\n        \"median\": 0,\n        \"mean\": 30,\n        \"ninetyfive_pct_quantile\": 30,\n        \"standard_deviation\": 0\n      }\n    },\n    \"type\": \"QueueStatistics\"\n  },\n  \"capacity\": {\n    \"duration\": 3000,\n    \"min\": 3,\n    \"max\": 3,\n    \"mean\": 3,\n    \"standard_deviation\": 0\n  }\n}\n

With println(r) a summary of the contents of the queues can be printed. E.g.:

{\n  \"claimedQuantity\": 3,\n  \"requestingComponents\": [\n    {\n      \"component\": \"Customer.292\",\n      \"quantity\": 1\n    },\n    {\n      \"component\": \"Customer.291\",\n      \"quantity\": 1\n    }\n  ],\n  \"creationTime\": 0,\n  \"name\": \"clerks\",\n  \"claimedBy\": [\n    {\n      \"first\": \"Customer.288\",\n      \"second\": null\n    },\n    {\n      \"first\": \"Customer.289\",\n      \"second\": null\n    },\n    {\n      \"first\": \"Customer.290\",\n      \"second\": null\n    }\n  ],\n  \"capacity\": 3\n}\n

Querying of the capacity, claimed quantity, available quantity and occupancy can be done with: r.capacity, r.claimedQuantity, r.availableQuantity and r.occupancy. All quantities are tracked by corresponding level monitors to provide statistics.

If the capacity of a resource is constant, which is very common, the mean occupancy can be found with:

r.occupancyMonitor.statistics().mean\n

When the capacity changes over time, it is recommended to use:

occupancy = r.claimedTimeline.statistics().mean / r.capacityTimeline.statistics().mean()\n

to obtain the mean occupancy.

Note that the occupancy is set to 0 if the capacity of the resource is <= 0.

"},{"location":"resource/#pre-emptive-resources","title":"Pre-emptive Resources","text":"

It is possible to specify that a resource is to be preemptive, by adding preemptive = true when the resource is created.

If a component requests from a preemptive resource, it may bump component(s) that are claiming from the resource, provided these have a lower priority. If component is bumped, it releases the resource and is then activated, thus essentially stopping the current action (usually hold or passivate).

Therefore, a component claiming from a preemptive resource should check whether the component is bumped or still claiming at any point where they can be bumped. This can be done with the method Component.isClaiming(resource) which is true if the component is claiming from the resource, or the opposite (Component.isBumped) which is true is the component is not claiming from the resource.

Examples using preemptive resources

  • Machine Shop
"},{"location":"setup/","title":"Installation","text":"

kalasim requires Java11 or higher.

"},{"location":"setup/#gradle","title":"Gradle","text":"

To get started simply add it as a dependency:

dependencies {\n    implementation 'com.github.holgerbrandl:kalasim:1.0.0'\n}\n

Builds are hosted on maven-central supported by the great folks at sonatype.

"},{"location":"setup/#jitpack-integration","title":"Jitpack Integration","text":"

You can also use JitPack with Maven or Gradle to include the latest snapshot as a dependency in your project.

repositories {\n    maven { url 'https://jitpack.io' }\n}\ndependencies {\n        implementation 'com.github.holgerbrandl:kalasim:-SNAPSHOT'\n}\n
"},{"location":"setup/#how-to-build-it-from-sources","title":"How to build it from sources?","text":"

To build and install it into your local maven cache, simply clone the repo and run

./gradlew install\n

"},{"location":"state/","title":"State","text":"

States provide a powerful tool for process interaction.

A state will have a value at any given time. In its simplest form a component can wait() for a specific value of a state. Once that value is reached, the component will be resumed.

"},{"location":"state/#examples","title":"Examples","text":"
  • Traffic
  • Bank Office with 1 clerk
  • Bank Office With Balking And Reneging
"},{"location":"state/#usage","title":"Usage","text":"

New States are defined as val doorOpen = State(false). The initial value is false, meaning the door is closed.

Now we can say :

doorOpen.value = true\n

to open the door.

If we want a person to wait for an open door, we could say :

wait(doorOpen, true)\n

The person's process definition will be suspended until the door is open.

We can obtain the current value (e.g. for logging) with:

print(\"\"\"door is ${if(doorOpen.value) \"open\" else \"closed\"}\"\"\")\n

The value of a state is automatically monitored in the State<T>.timeline level monitor.

All components waiting for a state are tracked in a (internal) queue, that can be obtained with doorOpen.waiters.

"},{"location":"state/#state-change-triggers","title":"State Change Triggers","text":"

If we just want at most one person to enter, we can use trigger() (which is a simple convenience wrapper around wait) with doorOpen.trigger(true, max=1). The following will happen:

  1. Temporarily change the state to the provided value,
  2. Reschedule max components (or less if there are fewer/no waiters) for immediate process continuation,
  3. and finally restore the previous state value.
"},{"location":"state/#type-support","title":"Type Support","text":"

States support generics, so we could equally well use any other type to model the value. For example, a traffic light could be modelled with a String state:

// initially the traffic light is red\nval light = State(\"red\")\n...\n// toggle its value to green\nlight.value = \"green\"\n

Or define a int/float state :

val level = State(0.0)\n\nlevel.value += 10\n

Since State<T> is a generic type, the compiler will reject invalid level associations such as

level.value = \"red\"\n
This won't compile because the type of level is Double.

"},{"location":"state/#metrics","title":"Metrics","text":"

States have a number of metrics endpoints:

  • valueMonitor tracks state changes over time
  • queueLength tracks the queue length level across time
  • lengthOfStay tracks the length of stay in the queue over time
"},{"location":"state/#process-interaction-with-wait","title":"Process interaction with wait()","text":"

A component can wait() for a state to get a certain value. In its most simple form this is done with

wait(doorOpen, true)\n

Once the doorOpen state is true, the component will be scheduled for process continuation.

As with request it is possible to set a timeout with failAt or failDelay :

wait(dooropen, true, failDelay=10.0)\nif(failed) print(\"impatient ...\")\n

In this example, the process will wait at max 10 ticks. If the state predicate was not met until then, the failed flag will be set and be consumed by the user.

There are two ways to test for a value

  • Value testing
  • Predicate testing
"},{"location":"state/#value-testing","title":"Value Testing","text":"

It is possible to test for a certain value:

wait(light, \"green\")\n

Or more states at once:

wait(light turns \"green\", light turns \"yellow\")  \n
where the wait is honored as soon is light is green OR yellow.

It is also possible to wait for all conditions to be satisfied, by adding all=true:

wait(light turns \"green\", engineRunning turns true, all=true) \n
Here, the wait is honored as soon as light is green AND the engine is running.

"},{"location":"state/#predicate-testing","title":"Predicate testing","text":"

This is a more complicated but also more versatile way of specifying the honor-condition. In that case, a predicate function (T) -> Boolean must be provided required to specify the condition.

"},{"location":"state/#example-1","title":"Example 1","text":"

val state = State(\"foo\")\nwait(state) { listOf(\"bar\", \"test\").contains(it) }\n
The wait is honored if the String State becomes either bar or test.

"},{"location":"state/#example-2","title":"Example 2","text":"
val intState = State(3.0)\nwait(intState) { it*3 < 42 }\n

In this last example the wait is honored as soon as the value fulfils it*3 < 42.

"},{"location":"theory/","title":"Simulation Theory","text":"

As defined by Shannon (1975),

a simulation is the process of designing a model of a real system and conducting experiments with this model for the purpose either of understanding the behavior of the system or of evaluating various strategies (within the limits imposed by a criterion or a set of criteria) for the operation of the system.

"},{"location":"theory/#what-is-discrete-event-simulation","title":"What is discrete event simulation?","text":"

A discrete event simulation (DES) is a tool that allows studying the dynamic behavior of stochastic, dynamic and discretely evolving systems such as

  • Factories
  • Ports & Airports
  • Traffic
  • Supply chains & Logistics
  • Controlling

In fact, every process that is founded on discrete state changes is suitable to be simulated with a discrete event simulation such as kalasim.

As described by Ucar, 2019, the discrete nature of a given system arises as soon as its behavior can be described in terms of events, which is the most fundamental concept in DES. An event is an instantaneous occurrence that may change the state of the system, while, between events, all the state variables remain.

There are several main DES paradigms. In activity-oriented DES the simulation clock advances in fixed time increments and all simulation entities are scanned and possibly reevaluated. Clearly, simulation performance degrades quickly with smaller increments and increasingly complex models.

In event-oriented DES is built around a list of scheduled events ordered by future execution time. During simulation, the these events are processed sequentially to update the state of the model.

Finally, process-oriented DES refines the event-oriented approach by defining a vocabulary of interactions to describe the interplay between simulation entities. This vocabulary is used by the modeler to define the component life-cycle processes of each simulation entity.

"},{"location":"theory/#applications-of-discrete-event-simulation","title":"Applications of discrete event simulation","text":"

Depending on the system in question, DES and kalasim in particular can provide insights into the process efficiency, risks or effectiveness. In addition, it allows assessing alternative what-if scenarios. Very often planning is all about estimating the effect of changes to a system. such as more/fewer driver, more/fewer machines, more/less repair cycles, more/fewer cargo trolleys.

Typical applications of discrete event simulations are

  • Production planning (such as bottleneck analysis)
  • Dimensioning (How many drivers are needed? Number of servers?)
  • Process automation & visualization
  • Digital twin development
  • Project management

For in-depth primers about simulation see here or Ucar, 2019.

"},{"location":"theory/#other-simulation-tools","title":"Other Simulation Tools","text":"

There are too many to be listed. In generally there are graphical tools and APIs . Graphical tools, such as AnyLogic excel by providing a flat learning curve, great visuals but often lack interfaces for extensibility or automation. APIs are usually much more flexible but often lack an intuitive approach to actually build simulations.

Out of the great number of APIs, we pinpoint just those projects/products which served as source of inspiration when developing kalasim.

"},{"location":"visualization/","title":"Visualization","text":"

There are two type of visualizations

  • Statistical plots to inspect distributions, trends and outliers. That's what described in this chapter
  • Process rendering to actually show simulation entities, their state or position changes on a 2D (or even 3D) grid as rendered movie. This may also involve interactive controls to adjust simulation parameters. Such functionality is planned but not yet implemented in kalasim

Examples * Movie Theater

"},{"location":"visualization/#built-in-visualizations","title":"Built-in Visualizations","text":"

Currently, the following extensions for distribution analysis are supported

Components

Monitors

  • CategoryTimeline<T>.display() provides a segment chart of the level
  • FrequencyTable<T>.display() provides a barchart of the frequencies of the different values
  • NumericStatisticMonitor.display() provides histogram of the underlying distribution
  • MetricTimeline.display() provides a line chart with time on the x and the value on y

Resources

  • r.activiities to show the activities as segments timeline
  • r.timeline to show the resource utilization and queuing status
  • All monitor related plots from above

Component Queue

  • All monitor related plots from above

For monitors, see corresponding section

"},{"location":"visualization/#framework-support","title":"Framework Support","text":"

By default, kalasim supports 2 pluggable visualization backends. Currently kravis and lets-plot are supported.

Since we may not be able to support all visualizations in both frontends, the user can simply toggle the frontend by package import:

// simply toggle backend by package import\nimport org.kalasim.plot.letsplot.display\n// or\n//import org.kalasim.plot.kravis.display\n\nMM1Queue().apply {\n    run(100)\n    server.claimedMonitor.display()\n}\n
"},{"location":"visualization/#kravis","title":"Kravis","text":"

kalasim integrates nicely with kravis to visualize monitor data. For examples see src/test/kotlin/org/kalasim/analytics/KravisVis.kt.

Note

To visualize data with kravis, R must be installed on the system. See here) for details.

"},{"location":"visualization/#letsplot","title":"LetsPlot","text":"

lets-plot is another very modern visualization library that renders within the JVM and thus does not have any external dependencies. Similar to kravis it mimics the API of ggplot2.

"},{"location":"animation/lunar_mining/","title":"Lunar Mining","text":"

Mining robots scan the surface of the moon for depletable water deposits.

From Wikipedia on Lunar Resources

The Moon bears substantial natural resources which could be exploited in the future. Potential lunar resources may encompass processable materials such as volatiles and minerals, along with geologic structures such as lava tubes that together, might enable lunar habitation. The use of resources on the Moon may provide a means of reducing the cost and risk of lunar exploration and beyond.

In a not so distant future, mankind will have established a permanent base on the moon. To fulfil its demand for water, the Earth Space Agency (ESPA) has decided to deploy a fleet of autonomous water-ice mining robots. These robots are designed to first analyze areas for possible water deposits. Detected deposits will be mined, and ice/water will be shipped and stored in the base station. It is a race against time for life and death, because the astronauts are very thirsty.

Full moon photograph taken 10-22-2010 from Madison, Alabama, USA; CC BY-SA 3.0

ESPA has ordered their process specialists to work out a simulation model of the mining process. With the simulation, the number of mining robots needed to supply the base with enough water must be determined. Also, water production rates shall be estimated.

ESPA simulation engineers have to solve two very typical tasks in industrial engineering

  1. Capacity Planning (number of mining robots needed)
  2. Forecast of Production KPIs (tons of water/day)
"},{"location":"animation/lunar_mining/#simulation-model","title":"Simulation Model","text":"

There is a complex interplay of rate-limited processes (transport, search, mining), limited resources and the harsh realities of deep space. The latter is abstracted away in the model as it does not contribute to model performance

  • While the specific locations of ice-deposits are unknown, their average distribution and size on the moon had been determined already using a satellite equipped with the onboard radar, ultraviolet detectors as well as a neutron spectrometer
  • Small harvester robots are being deployed from a central depot to scan the lunar surface for water deposits
  • When finding a depot they deplete it
  • They have a limited storage capacity (100kg), so they will need to shuttle the cargo to the base
  • The base will consume water constantly (exponentially distributed with a mean of 5 kg/h)
  • The base has an initial deposit of 100kg water (which was shipped to the moon very expensively with rockets from earth)
  • Idle harvesters will consult the base for nearby deposits discovered by other units

The complete model definition can be found here. As an example, we inspect the unloading process of water at the base

fun unload() = sequence {\n    moveTo(base.position)\n\n    val unloadingUnitsPerHours = 20  // speed of unloading\n\n    // unloading time correlates with load status\n    currentState = UNLOADING\n    hold((tank.level / unloadingUnitsPerHours).roundToInt().hours,\n         \"Unloading ${tank.level} water units\")\n\n    // put the water into the refinery of the base\n    put(get<Base>().refinery, tank.level)\n\n     // empty the tank\n    take(tank, tank.level)\n\n    activate(process = Harvester::harvesting)\n}\n
Modelled as process definition, it can be easily started with activate().

A state variable currentState allows for later analysis about what the robots were doing. Unloading is actually separated over 2 independent resources:

  • the tank of the mining robot
  • the refinery of the base

Both are modelled as depletable resource, so they can be consumed and refilled with take() and put() respectively.

Once water unloading is complete, another sub-process of the ice harvester is activated: It's going back into harvesting mode, i.e. the robot is returning to its last mined deposit to continue ice collection.

API surface of the lunar mining simulation model

"},{"location":"animation/lunar_mining/#process-animation","title":"Process Animation","text":"

The model can be expressed easily in approximately 200 lines of process definitions in LunarMining.kt. Howvever, it was not initially clear, if the intended dynamics were implemented correctly. Process animation comes to resuce, as it allows to debug of the model vsually.

A process animation was developed as well to better understand the spatio-temporal dynamics of the model. In LunarMiningHQ.kt the animation of this process is worked out in just about 150 lines of code.

We used different capabilties of the animation system (based on OPENRNDR)

  • Image background to draw a map of the moon
  • Dynamic shape contour to indicate loading status of the harvesters
  • SVG objects for harvesters and base
  • Automatic video recording
  • Text and simple shapes to draw deposits and process properties
"},{"location":"animation/lunar_mining/#supply-optimization","title":"Supply Optimization","text":"

To assess how many ice harvesters are needed to ensure base survival we can play what-if with our model. We do so in a fully reproducible manner right in place here. First we load kalasim and import required classes.

@file:Repository(\"*mavenLocal\")\n\n%useLatestDescriptors on\n%use kalasim(0.7.94)\n%use kravis(0.8.4)\n\n@file:DependsOn(\"org.kalasim.demo:lunar-mining:1.0-SNAPSHOT\")\n\nimport org.kalasim.demo.moon.*\nimport krangl.asDataFrame\nimport krangl.bindRows\n

Next we can run the simulation multiple times with different numbers of robots and compare the outcome.

val sims = List(9) { numHarvesters ->\n    List(100) {\n        LunarMining(numHarvesters+1, 15, false, it).apply { run(60*60) }\n    }\n}.flatten()\n

To work with the data, we first combine the refinery water level timelines into a data-frame.

val waterSupply = sims.withIndex().map { (idx, sim) ->\n    sim.base.refinery.levelTimeline//.statistics()\n        .stepFun()\n        .asDataFrame()\n        .addColumn(\"num_harvesters\") { sim.harvesters.size }\n        .addColumn(\"run\") { idx }\n}.bindRows()\n

First, we can study the water level in the central refinery across all the 100 simuation runs.

waterSupply\n     .addColumn(\"num_harvesters\"){\n        it[\"num_harvesters\"].map<Int>{ it.toString()+ \" harvesters\"}\n     }\n    .plot(x = \"time\", y = \"value\", group=\"run\", color=\"num_harvesters\")\n    .geomLine( alpha = .1)\n    .facetWrap(\"num_harvesters\", scales=FacetScales.free_y)\n    .guides(color=LegendType.none)\n

With more ice harvesters working around the base, supply of water is ensured. Initially there is a phase, were no deposits are yet discovererd, so the base is under a severe risk of running dry. To assess how often this happens, we count the number of runs per harvester where the base's refinery was depleted.

sims.map { sim ->\n    (\"h \"+sim.harvesters.size) to\n            sim.base.refinery.levelTimeline.statistics().min\n}.plot(x={ first}, fill={second==0.0})\n    .geomBar()\n    .labs(x=\"# harvesters\", y=\"# simulation runs\", fill = \"Base Depleted?\")\n

As shown in the figure, it turns out, that with >=5 ice harvestering robots, the risk of water supply depletion at the base station is within an acceptable range.

We have just analyzed our lunar mining model using controlled randomization, and have performed a basic capacity analysis.

"},{"location":"animation/lunar_mining/#exercise-maintenance-module","title":"Exercise: Maintenance Module","text":"

The model could be extended to model robot health as well

  • Occasional meteoroids hits will affect the harvester health status (with the varying amount, and which eventually will lead to robot outage)
  • Harvesters health is slowly decreasing while depleting deposits
  • Harvesters can be repaired in a special maintenance depot (which is a bit far off), so they must sure to get their in time because picking up broken robots in the field is very time consumin & expensive
"},{"location":"animation/lunar_mining/#summary","title":"Summary","text":"

ESPA is relieved. The simulation model showed that sufficient water-supplies can be gathered with 5 mining robots. The astronauts can even take a shower every Sunday from now on.

Using a discrete event simulation model built with kalasim, we have animated the process and have analyzed its statistical properties.

"},{"location":"articles/2021-11-27-kalasim-v07/","title":"Kalasim v0.7","text":"

After quite some months of exploration, API refinements, countless simulations, and some literature research, we present with great pleasure the next milestone release of kalasim!

kalasim v0.7 is not just for engineers, but for process analysts and industrial engineers who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases. So, we deliberately took some time with this release to gather and analyze feedback from our users.

With this milestone release, we have stabilized the core API considerably, improved its performance dramatically while adding new features all over the place.

"},{"location":"articles/2021-11-27-kalasim-v07/#new-features","title":"New Features","text":"

Major enhancements in this release are

  • Added processRepeated to streamline modelling of reiterating processes
  • Reworked event & metrics logging API for better configurability and performance
  • Introduced ComponentList to provide metrics-enhanced collection similar to the existing ComponentQueue
  • Implemented ticks metrics monitor to streamline simulation monitoring
  • Added new timeline and activity log attributes to resources for streamlined utilization analytics
  • Extended display() support API on all major components and their collections (including Resource, Component or List<Component>, MetricTimeline)
  • Enabled simplified simulation parallelism by changing the dependency context registry to become thread-local
  • Dramatically improved simulation performance to scale at ease to thousands of simulation entities

See kalasim's changlog for a complete list of technical changes in the v0.7 milestone release

"},{"location":"articles/2021-11-27-kalasim-v07/#documentation-improvements","title":"Documentation Improvements","text":"

We've rewritten a large part of the documentation for better readability. In particular, we've focussed on resources and components, which are the key elements of every business process model. A new chapter about collections was added, and the numerous advanced topics were worked out to cover more aspects of the product in much more detail.

Several new examples were added including the famous Bridge Games. The ATM was rebuilt using a jupyter-notebook example to better illustrate parallelization and the new visualization support API. Finally, we started a new larger scale example simulation to model the interplay of processes in an emergency room.

"},{"location":"articles/2021-11-27-kalasim-v07/#acknowledgments","title":"Acknowledgments","text":"

Different individuals and organizations made this milestone release possible. Most importantly, we'd like to thank SYSTEMA GmbH for supporting the project. Special thanks go to Ilya Muradyan and Igor Alshannikov from JetBrains for their patience with us and their wonderful support with Kotlin data-science tooling. We like to thank Arnaud Giuliani for providing great koin support and guidance, which is the basement on which we managed to build kalasim.

Finally, we'd like to thank the wonderful folks at CASUS for providing us the opportunity to introduce kalasim to a great simulation experts panel.

"},{"location":"articles/2021-11-27-kalasim-v07/#next-steps","title":"Next steps","text":"

We're having a packed feature roadmap. On the top of our roadmap are the following ideas

  • Environment snapshotting & branching: This feature will dramatically ease distributed simulations, prepare for new types of AI connectivity, and will enable confidence bands for projects after user-defined branching events
  • Environment merging: We strive to enable algebraic composability of simulation environments
  • Better examples: Existing examples are intentionally kept small to illustrate the API. Next, we plan to release some large simulations with thousands of simulation entities, along with protocols on how to analyze dynamics in such systems
  • Adopt new Kotlin v1.6 language features such as the new duration API, simplified suspend method semantics, and builder inference improvements

Please note, that the kalasim APIs will be subject to breaking changes until a very distant major release.

If you think that kalasim is missing some important feature, please just let us know.

"},{"location":"articles/2022-09-27-kalasim-v08/","title":"Kalasim v0.8","text":"

After some more months of continued refinements, extensions and refactorings, and - for sure - a sightly number of new simulations across different domains and industries, we present with great pleasure the next milestone v0.8 release of kalasim!

kalasim v0.8 has matured considerable across the entire API. From a small experimental API it has grown into a battle-tested real-time scalable open-architecture simulation engine, designed not just for engineers, but for business process analysts and industrial engineers who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases.

"},{"location":"articles/2022-09-27-kalasim-v08/#new-features","title":"New Features","text":"

With this milestone release, we have further stabilized its core API, improved its performance while adding new features all over the place.

Major enhancements in this release are

  • Support for kotlin.time.Duration across the entire API. Processes can be expressed much more naturally using time-units:
val sim = createSimulation {\n    object : Component() {\n        override fun process() = sequence {\n            hold(3.days)\n            // some action\n            hold(2.minutes)\n        }\n    }\n}\n\nsim.run(3.years)\n
  • Added new options to model resource honor policies allowing for more configurable request queue consumption

    val r  = Resource(honorPolicy = RequestHonorPolicy.StrictFCFS)\n

  • Added Timeline Arithmetics. It is now possible to perform stream arithmetics on timeline attributes

  • We have reworked and simplified depletable resources. This enables a wide range of new use-cases. See lunar mining for a great example. As part of this feature, we have introduced different request modes to model resources requests that exceed resource capacity.
    val tank  = DepletableResource(capacity=100, initialLevel=60)\n\nput(gasSupply, 50, capacityLimitMode = CapacityLimitMode.CAP)\n
  • A new animation submodule to visualize process simulations was added. To keep the core API minimalistic, a new dependency adds all required dependencies from OpenRendr. This additional dependency also provides complimentary utilities such as AnimationComponent to streamline rendering. To demonstrate the capabilities, we have worked out several examples such as the moon base and the office tower.

Other notable enhancements in this release are a streamlined predicate consumption in wait(), more supported statistical distributions, improved bottleneck analysis using resource request-ids and RequestScopeContext in honor block. First community PRs were merged, in particular #35 which improved the support for asynchronous event consumption.

For a complete list of technical changes in the v0.8 milestone release check out our change log.

"},{"location":"articles/2022-09-27-kalasim-v08/#example-documentation-improvements","title":"Example & Documentation Improvements","text":"

Several new examples were added as part of this release. First, we explored resource mining on the moon, where we don't just demonstrate how to model a complex mining and logistics operation, but also showcase how to animate this process. In the office tower we explore capacity planning via an interactive UI to size elevators in a busy office building.

"},{"location":"articles/2022-09-27-kalasim-v08/#acknowledgments","title":"Acknowledgments","text":"

Different individuals and organizations made this milestone release possible. Most importantly, we'd like to thank SYSTEMA GmbH for supporting the project.

"},{"location":"articles/2022-09-27-kalasim-v08/#next-steps","title":"Next steps","text":"

While improving kalasim, we have dropped some roadmap items sketched out earlier.

  • Environment snapshotting & branching: While we still believe that this would be highly beneficial, the feature is currently blocked by issues with serialization of kotlin objects (in particular coroutines)
  • We have evaluated but eventually dropped the idea of algebraic composability of simulation environments. Mainly because instances of org.kalasim.Environment can be configured to be incompatible on various levels which can't be resolved with a simple +

Next on our roadmap are various open tickets as well as the following meta-tasks

  • The next release is likely to enforce a tick-duration (seconds, hours, etc.) for any simulation. Along with that, to improve the type-safety and readability of process definitions, we will start replacing all - essentially untyped - tick-time duration method arguments with kotlin.time.Duration equivalents.
  • Better examples & better teaching materials: We will continue to release more complex simulations with thousands of simulation entities (in particular finishing the emergency room), along with protocols on how to analyze and optimize dynamics in such systems.
  • Improved kotlin-jupyter integration to bring more control and introspection functions into the browser.

Please note, that the kalasim APIs will be subject to breaking changes until a first major release.

If you think that kalasim is missing some important feature, please just let us know.

"},{"location":"articles/2022-11-25-kalasim-at-wsc22/","title":"WSC22","text":"

kalasim will be very present this year at the Winter Simulation Conference 2022 (Singapore, December 11-14, 2022). Feel welcome to reach out to us at the conference to discuss about simulation, kalasim, process analytics & optimization, or kotlin for data science. We are also ready - and eager - to support you with your simulations written in kalasim at the conference. We intentionally do not have a physical booth - our booth will just be where we meet you!

As part of the research initiative AISSI, where various partners from industry and academy develop, integrate and apply novel AI-based approaches to bring scheduling to a new level, we have modelled a complex production process with kalasim. By applying reinforcement learning in a framework for autonomous, integrated production and maintenance scheduling, we strive to outperform classical planning methods wrt critical KPIs such as throughput or due date adherence.

As part of the Modeling and Simulation of Semiconductor Manufactoring track, we - Holger Brandl (lead dev of kalasim), Philipp Rossbach, and Hajo Terbrack from SYSTEMA GmbH and Tobias Sprogies from NEXPERIA Germany GmbH) - will proudly present our analysis of a complex manufacturing process simulation implemented with kalasim.

Maximizing Throughput, Due Date Compliance and Other Partially Conflicting Objectives Using Multifactorial AI-powered Optimization

For the abstract see here

kalasim has grown very quickly from small experimental API into a battle-tested real-time scalable open-architecture next-generation code-first simulation engine, designed not just for engineers, but for business process analysts and industrial engineers who need to go beyond the limitations of existing simulation tools to model and optimize their business-critical use-cases.

If you want to get started with kalasim, need support, or if you think that some important feature is yet missing, feel welcome to get in touch.

"},{"location":"articles/articles/","title":"Articles","text":"

News, articles, and tutorials centering simulation best practices, success stories from industries, and technical deep dives.

We've just started this section, so please be a bit patient in here :-)

"},{"location":"examples/atm_queue/","title":"ATM Queue","text":""},{"location":"examples/atm_queue/#simple-queue-model","title":"Simple Queue Model","text":"

Let's explore the expressiveness of kalasims process description using a traditional queuing example, the M/M/1. This Kendall's notation describes a single server - here a ATM - with exponentially distributed arrivals, exponential service time and an infinte queue.

The basic parameters of the system are

  • \u03bb - people arrival rate at the ATM
  • \u00b5 - money withdrawal rate

If \u03bb/\u00b5 > 1, the queue is referred to as unstable since there are more arrivals than the ATM can handle. The queue will grow indefinitely.

Let's start simply. First, we work out the basic model without much code reusability in mind.

The ATM example is inspired from the simmer paper Ucar et al. 2019.

 val sim = createSimulation {\n    val lambda = 1.5\n    val mu = 1.0\n    val rho = lambda / mu\n\n    println(\n        \"rho is ${rho}. With rho>1 the system would be unstable, \" +\n                \"because there are more arrivals then the atm can serve.\"\n    )\n\n    val atm = Resource(\"atm\", 1)\n\n    class Customer : Component() {\n        val ed = exponential(mu)\n\n        override fun process() = sequence {\n\n            request(atm)\n\n            hold(ed.sample())\n            release(atm)\n        }\n    }\n\n    ComponentGenerator(iat = exponential(lambda)) { Customer() }\n\n    run(2000)\n\n    atm.occupancyTimeline.display()\n    atm.requesters.queueLengthMonitor.display()\n    atm.requesters.lengthOfStayMonitor.display()\n\n    println(\"\\nqueue statistics: ${atm.requesters.lengthOfStayMonitor.statistics()}\")\n}\n
rho is 1.5. With rho>1 the system would be unstable, because there are more arrivals then the atm can serve.\n\n\nqueue statistics: {\n  \"entries\": 1312,\n  \"median\": 3.268,\n  \"mean\": 2.061,\n  \"ninety_pct_quantile\": 6.321,\n  \"standard_deviation\": 3.268,\n  \"ninetyfive_pct_quantile\": 9.091\n}\n
"},{"location":"examples/atm_queue/#simple-whatif","title":"Simple WhatIf","text":"

To explore the impact of lambda and mu on these statistics, we rework the example to become a bit more generic.

class AtmCustomer(\n    val mu: Double,\n    val atm: Resource,\n    koin: Koin = DependencyContext.get()\n) : Component(koin = koin) {\n    val ed = exponential(mu)\n\n    override fun process() = sequence {\n        request(atm)\n\n        hold(ed.sample())\n        release(atm)\n    }\n}\n\nclass AtmQueue(val lambda: Double, val mu: Double) : Environment() {\n    val atm = dependency { Resource(\"atm\", 1) }\n\n    init {\n        ComponentGenerator(iat = exponential(lambda)) {\n            AtmCustomer(mu, atm, koin = getKoin())\n        }\n    }\n}\n

Then, we evaluate a parameter grid.

   // build parameter grid\nval lambdas = (1..20).map { 0.25 }.cumSum()\nval mus = (1..20).map { 0.25 }.cumSum()\n\n// run 100x times\nval atms = cartesianProduct(lambdas, mus).map { (lambda, mu) ->\n    AtmQueue(lambda, mu).apply { run(100) }\n}\n

We now extract the ATM parameters along with he mean queue length of each ATM instance into a data-frame.

atms.map {\n    it to it.get<Resource>().statistics.requesters.lengthStats.mean!!.roundAny(2)\n}.toList()\n    .asDataFrame()\n    .unfold<AtmQueue>(\"first\", listOf(\"mu\", \"lambda\"), keep=false)\n    .rename(\"second\" to \"mean_queue_length\")\n
mean_queue_lengthlambdamu8.250.250.25113.830.250.5149.730.250.75172.690.251.0178.590.251.25206.610.251.5188.260.251.75205.890.252.0209.680.252.25210.420.252.5

... with 390 more rows. Shape: 400 x 3.

"},{"location":"examples/atm_queue/#parallel-whatif","title":"Parallel WhatIf","text":"

Very often, simulation models are complex, so running different simulations in parellel allows to minimize overall execution time

First, we build a number of sims (as Sequence) and work them out in parallel using kotlin coroutines.

val atms = cartesianProduct(lambdas, mus).asIterable().map { (lambda, mu) ->\n    // instantiate sequentially to simplify dependency injection\n    AtmQueue(lambda, mu)\n}.toList()\n\n// define parallelization helper to run in parallel\n// https://stackoverflow.com/questions/34697828/parallel-operations|-on-kotlin-collections\nfun <A, B> Iterable<A>.pmap(f: suspend (A) -> B): List<B> = runBlocking {\n    map { async(newFixedThreadPoolContext(4, \"\")) { f(it) } }.map { it.await() }\n}\n\n// simulate in parallel\natms.pmap {\n    it.run(100)\n}.forEach{} // supppress the output\n

Something really cool has just happened. We have run as many simulations in parallel as there are cores on this computer.

Next, we can summarize our findings by visualizing the results in usin a heatmap.

// extract stats and visualize\nval meanQLength = atms.map { it to it.get<Resource>().statistics.requesters.lengthStats.mean!! }\n\nmeanQLength.plot(x = { first.lambda }, y = { first.mu }, fill = { second })\n    .geomTile()\n    .title(\"Mean ATM Queue Length vs Labmda and Mu\")\n    .xLabel(\"Labmda\").yLabel(\"Mu\")\n

"},{"location":"examples/atm_queue/#conclusion","title":"Conclusion","text":"

In this example we have explored a simple simulation model. In in fact we have not built just a single model, but instead we have modelled a range of ATMs with differeing settings to better understand the dynamics of the process at hand.

For complete sources, also see the jupyter notebook or plain kotlin sources. Feel welcome to get in touch for support, suggestions, and questions.

"},{"location":"examples/bank_office/","title":"Bank Office","text":"

Queue problems are common-place application of discrete event simulation.

Often there are multiple solutions for a model. Here we model similar problems - a customer queue - differently using resources, states and queues in various configurations and interaction patterns.

"},{"location":"examples/bank_office/#simple-bank-office-1-clerk","title":"Simple Bank Office (1 clerk)","text":"

Lets start with a bank office where customers are arriving in a bank, where there is one clerk. This clerk handles the customers in a first in first out (FIFO) order.

We see the following processes:

  • The customer generator that creates the customers, with an inter-arrival time of uniform(5,15)
  • The customers
  • The clerk, which serves the customers in a constant time of 30 (overloaded and non steady state system)

We need a queue for the customers to wait for service.

The model code is:

////Bank1clerk.kt\npackage org.kalasim.examples.bank.oneclerk\n\nimport org.kalasim.*\nimport org.kalasim.misc.printThis\nimport org.koin.core.component.inject\nimport kotlin.time.Duration\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass Customer(\n    val waitingLine: ComponentQueue<Customer>,\n    val clerk: Clerk\n) : Component() {\n    override fun process() = sequence {\n        waitingLine.add(this@Customer)\n\n        if(clerk.isPassive) clerk.activate()\n\n        passivate()\n    }\n}\n\n\nclass Clerk(val serviceTime: Duration = 10.minutes) : Component() {\n    val waitingLine: ComponentQueue<Customer> by inject()\n\n    override fun process() = sequence {\n        while(true) {\n            while(waitingLine.isEmpty()) passivate()\n\n            val customer = waitingLine.poll()\n\n            hold(serviceTime) // bearbeitungszeit\n            customer.activate()\n        }\n    }\n}\n\nclass CustomerGenerator : Component() {\n\n    override fun process() = sequence {\n        while(true) {\n            Customer(get(), get())\n\n            hold(uniform(5.minutes, 15.minutes).sample())\n        }\n    }\n}\n\n\nfun main() {\n    val deps = declareDependencies {\n        dependency { Clerk() }\n        dependency { ComponentQueue<Customer>(\"waiting line\") }\n    }\n\n    val env = createSimulation(dependencies = deps) {\n        enableComponentLogger()\n\n        CustomerGenerator()\n    }\n\n    env.run(50.hours)\n\n    val waitingLine: ComponentQueue<Customer> = env.get()\n\n    waitingLine.statistics.printThis()\n\n//    if(canDisplay()) {\n//        waitingLine.queueLengthTimeline.display()\n//        waitingLine.lengthOfStayStatistics.display()\n//    }\n}\n

Let's look at some details (marked in yellow for convenience).

With:

waitingLine.add(this@Customer)\n

the customer places itself at the tail of the waiting line.

Then, the customer checks whether the clerk is idle, and if so, activates him immediately.:

if (clerk.isPassive) clerk.activate()\n

Once the clerk is active (again), it gets the first customer out of the waitingline with:

val customer = waitingLine.poll()\n

and holds for 10 days units with:

hold(10.days)\n

After that hold the customer is activated and will terminate:

customer.activate()\n

In the main section of the program, we create the CustomerGenerator, the Clerk and a ComponentQueue called waitingline. Here the customer generator is implemented as a custom instance of Component for educational puroposes. Using the provided ComponentGenerator API would be more concise.

hold(uniform(5.0, 15.0).sample())\n

will do the statistical sampling and wait for that time till the next customer is created.

Since logging is enabled when creating the simulation with createSimulation the following log trace is being produced

time      current component        action                                       info                               \n--------- ------------------------ -------------------------------------------- ----------------------------------\n.00                                main create\n.00       main\n.00                                Clerk.1 create\n.00                                Clerk.1 activate                             scheduled for .00\n.00                                CustomerGenerator.1 create\n.00                                CustomerGenerator.1 activate                 scheduled for .00\n.00                                main run +50.00                              scheduled for 50.00\n.00       Clerk.1\n.00                                Clerk.1 passivate\n.00       CustomerGenerator.1\n.00                                Customer.1 create\n.00                                Customer.1 activate                          scheduled for .00\n.00                                CustomerGenerator.1 hold +11.95              scheduled for 11.95\n.00       Customer.1\n.00                                Customer.1 entering waiting line\n.00                                Clerk.1 activate                             scheduled for .00\n.00                                Customer.1 passivate\n.00       Clerk.1\n.00                                Customer.1 leaving waiting line\n.00                                Clerk.1 hold +10.00                          scheduled for 10.00\n10.00                              Clerk.1\n10.00                              Customer.1 activate                          scheduled for 10.00\n10.00                              Clerk.1 passivate\n10.00     Customer.1\n10.00                              Customer.1 ended\n11.95     CustomerGenerator.1\n11.95                              Customer.2 create\n11.95                              Customer.2 activate                          scheduled for 11.95\n11.95                              CustomerGenerator.1 hold +7.73               scheduled for 19.68\n11.95     Customer.2\n11.95                              Customer.2 entering waiting line\n11.95                              Clerk.1 activate                             scheduled for 11.95\n11.95                              Customer.2 passivate\n11.95     Clerk.1\n11.95                              Customer.2 leaving waiting line\n11.95                              Clerk.1 hold +10.00                          scheduled for 21.95\n19.68     CustomerGenerator.1\n19.68                              Customer.3 create\n19.68                              Customer.3 activate                          scheduled for 19.68\n19.68                              CustomerGenerator.1 hold +10.32              scheduled for 30.00\n19.68     Customer.3\n19.68                              Customer.3 entering waiting line\n19.68                              Customer.3 passivate\n21.95     Clerk.1\n21.95                              Customer.2 activate                          scheduled for 21.95\n21.95                              Customer.3 leaving waiting line\n21.95                              Clerk.1 hold +10.00                          scheduled for 31.95\n21.95     Customer.2\n21.95                              Customer.2 ended\n30.00     CustomerGenerator.1\n30.00                              Customer.4 create\n30.00                              Customer.4 activate                          scheduled for 30.00\n30.00                              CustomerGenerator.1 hold +10.63              scheduled for 40.63\n30.00     Customer.4\n30.00                              Customer.4 entering waiting line\n30.00                              Customer.4 passivate\n31.95     Clerk.1\n31.95                              Customer.3 activate                          scheduled for 31.95\n31.95                              Customer.4 leaving waiting line\n31.95                              Clerk.1 hold +10.00                          scheduled for 41.95\n31.95     Customer.3\n31.95                              Customer.3 ended\n40.63     CustomerGenerator.1\n40.63                              Customer.5 create\n40.63                              Customer.5 activate                          scheduled for 40.63\n40.63                              CustomerGenerator.1 hold +5.31               scheduled for 45.95\n40.63     Customer.5\n40.63                              Customer.5 entering waiting line\n40.63                              Customer.5 passivate\n41.95     Clerk.1\n41.95                              Customer.4 activate                          scheduled for 41.95\n41.95                              Customer.5 leaving waiting line\n41.95                              Clerk.1 hold +10.00                          scheduled for 51.95\n41.95     Customer.4\n41.95                              Customer.4 ended\n45.95     CustomerGenerator.1\n45.95                              Customer.6 create\n45.95                              Customer.6 activate                          scheduled for 45.95\n45.95                              CustomerGenerator.1 hold +12.68              scheduled for 58.63\n45.95     Customer.6\n45.95                              Customer.6 entering waiting line\n45.95                              Customer.6 passivate\n50.00     main\n

After the simulation is finished, the statistics of the queue are presented with:

waitingLine.stats.print()\n

The statistics output looks like

{\n  \"queue_length\": {\n    \"all\": {\n      \"duration\": 50,\n      \"min\": 0,\n      \"max\": 1,\n      \"mean\": 0.15,\n      \"standard_deviation\": 0.361\n    },\n    \"excl_zeros\": {\n      \"duration\": 7.500540828621098,\n      \"min\": 1,\n      \"max\": 1,\n      \"mean\": 1,\n      \"standard_deviation\": 0\n    }\n  },\n  \"name\": \"waiting line\",\n  \"length_of_stay\": {\n    \"all\": {\n      \"entries\": 5,\n      \"ninety_pct_quantile\": 3.736,\n      \"median\": 1.684,\n      \"mean\": 1.334,\n      \"ninetyfive_pct_quantile\": 3.736,\n      \"standard_deviation\": 1.684\n    },\n    \"excl_zeros\": {\n      \"entries\": 3,\n      \"ninety_pct_quantile\": 3.736,\n      \"median\": 1.645,\n      \"mean\": 2.223,\n      \"ninetyfive_pct_quantile\": 3.736,\n      \"standard_deviation\": 1.645\n    }\n  },\n  \"type\": \"QueueStatistics\",\n  \"timestamp\": 50\n}\n
"},{"location":"examples/bank_office/#bank-office-with-3-clerks","title":"Bank Office with 3 Clerks","text":"

Now, let's add more clerks:

add { (1..3).map { Clerk() } }\n

And, every time a customer enters the waiting line, we need to make sure at least one passive clerk (if any) is activated:

for (c in clerks) {\n    if (c.isPassive) {\n        c.activate()\n        break // activate at max one clerk\n    }\n}\n

The complete source of a three clerk post office:

////Bank3Clerks.kt\npackage org.kalasim.examples.bank.threeclerks\n\nimport org.kalasim.*\nimport org.koin.core.component.inject\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass CustomerGenerator : Component() {\n\n    override fun process() = sequence {\n        while(true) {\n            Customer(get())\n            hold(uniform(5.0, 15.0).minutes.sample())\n        }\n    }\n}\n\nclass Customer(val waitingLine: ComponentQueue<Customer>) : Component() {\n    private val clerks: List<Clerk> by inject()\n\n    override fun process() = sequence {\n        waitingLine.add(this@Customer)\n\n        for(c in clerks) {\n            if(c.isPassive) {\n                c.activate()\n                break // activate at max one clerk\n            }\n        }\n\n        passivate()\n    }\n}\n\n\nclass Clerk : Component() {\n    private val waitingLine: ComponentQueue<Customer> by inject()\n\n    override fun process() = sequence {\n        while(true) {\n            if(waitingLine.isEmpty())\n                passivate()\n\n            val customer = waitingLine.poll()\n            hold(30.minutes) // bearbeitungszeit\n            customer.activate() // signal the customer that's all's done\n        }\n    }\n}\n\n\nfun main() {\n    createSimulation {\n        dependency { ComponentQueue<Customer>(\"waitingline\") }\n        dependency { State(false, \"worktodo\") }\n        dependency { CustomerGenerator() }\n        dependency { (1..3).map { Clerk() } }\n\n        run(50000.minutes)\n\n        val waitingLine: ComponentQueue<Customer> = get()\n\n//        if(canDisplay()) {\n////        waitingLine.lengthOfStayMonitor.printHistogram()\n////        waitingLine.queueLengthMonitor.printHistogram()\n//\n//            waitingLine.queueLengthTimeline.display()\n//            waitingLine.lengthOfStayStatistics.display()\n        waitingLine.queueLengthTimeline.printSummary()\n        waitingLine.queueLengthTimeline.printSummary()\n\n//        }\n\n//        waitingLine.stats.toJson().toString(2).printThis()\n        waitingLine.printSummary()\n    }\n}\n
"},{"location":"examples/bank_office/#bank-office-with-resources","title":"Bank Office with Resources","text":"

kalasim contains another useful concept for modelling: Resources. Resources have a limited capacity and can be claimed by components and released later.

In the model of the bank with the same functionality as the above example, the clerks are defined as a resource with capacity 3.

The model code is:

////Bank3ClerksResources.kt\npackage org.kalasim.examples.bank.resources\n\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass Customer(private val clerks: Resource) : Component() {\n\n    override fun process() = sequence {\n        request(clerks)\n        hold(30.minutes)\n        release(clerks) // not really required\n    }\n}\n\n\nfun main() {\n    val env = createSimulation {\n        dependency { Resource(\"clerks\", capacity = 3) }\n\n        ComponentGenerator(iat = uniform(5.0, 15.0).minutes) { Customer(get()) }\n    }\n\n    env.run(3.days)\n\n    env.get<Resource>().apply {\n        printSummary()\n\n//        if(canDisplay()) {\n//            claimedTimeline.display()\n//            requesters.queueLengthTimeline.display()\n//        }\n\n        printStatistics()\n    }\n}\n

Let's look at some details.:

add { Resource(\"clerks\", capacity = 3) }\n

This defines a resource with a capacity of 3.

Each customer tries to claim one unit (=clerk) from the resource with:

request(clerks)\n

B default 1 unit will be requested. If the resource is not available, the customer needs to wait for it to become available (in order of arrival).

In contrast with the previous example, the customer now holds itself for 30 time units (clicks). After this time, the customer releases the resource with:

release(clerks)\n

The effect is that kalasim then tries to honor the next pending request, if any.

In this case the release statement is not required, as resources that were claimed are automatically released when a process terminates).`

The statistics are maintained in two system queues, called clerk.requesters and clerk.claimers.

The output is very similar to the earlier example. The statistics are exactly the same.

"},{"location":"examples/bank_office/#bank-office-with-balking-and-reneging","title":"Bank Office with Balking and Reneging","text":"

Now, we assume that clients are not going to the queue when there are more than 5 clients waiting (balking). On top of that, if a client is waiting longer than 50, he/she will leave as well (reneging).

The model code is:

////Bank3ClerksReneging.kt\npackage org.kalasim.examples.bank.reneging\n\nimport org.kalasim.*\nimport org.kalasim.misc.printThis\nimport org.kalasim.monitors.printHistogram\nimport org.koin.core.component.inject\nimport kotlin.time.Duration.Companion.minutes\n\n\n//**{todo}** use monitors here and maybe even inject them\n//to inject use data class Counter(var value: Int)\nvar numBalked: Int = 0\nvar numReneged: Int = 0\n\nclass CustomerGenerator : Component() {\n\n    override fun process() = sequence {\n        while(true) {\n            Customer(get())\n            hold(uniform(5.0, 15.0).minutes.sample())\n        }\n    }\n}\n\nclass Customer(val waitingLine: ComponentQueue<Customer>) : Component() {\n    private val clerks: List<Clerk> by inject()\n\n    override fun process() = sequence {\n        if(waitingLine.size >= 5) {\n            numBalked++\n\n            log(\"balked\")\n            cancel()\n        }\n\n        waitingLine.add(this@Customer)\n\n        for(c in clerks) {\n            if(c.isPassive) {\n                c.activate()\n                break // activate only one clerk\n            }\n        }\n\n        hold(50.minutes) // if not serviced within this time, renege\n\n        if(waitingLine.contains(this@Customer)) {\n            //  this@Customer.leave(waitingLine)\n            waitingLine.remove(this@Customer)\n\n            numReneged++\n            log(\"reneged\")\n        } else {\n            // if customer no longer in waiting line,\n            // serving has started meanwhile\n            passivate()\n        }\n    }\n}\n\n\nclass Clerk : Component() {\n    private val waitingLine: ComponentQueue<Customer> by inject()\n\n    override fun process() = sequence {\n        while(true) {\n            if(waitingLine.isEmpty())\n                passivate()\n\n            val customer = waitingLine.poll()\n            customer.activate() // get the customer out of it's hold(50)\n\n            hold(30.minutes) // bearbeitungszeit\n            customer.activate() // signal the customer that's all's done\n        }\n    }\n}\n\n\nfun main() {\n    val env = createSimulation {\n        enableComponentLogger()\n\n        // register components needed for dependency injection\n        dependency { ComponentQueue<Customer>(\"waitingline\") }\n        dependency { (0..2).map { Clerk() } }\n\n        // register other components to  be present when starting the simulation\n        CustomerGenerator()\n\n        val waitingLine: ComponentQueue<Customer> = get()\n\n        waitingLine.lengthOfStayStatistics.enabled = false\n        run(1500.minutes)\n\n        waitingLine.lengthOfStayStatistics.enabled = true\n        run(500.minutes)\n\n        // with console\n        waitingLine.lengthOfStayStatistics.printHistogram()\n        waitingLine.queueLengthTimeline.printHistogram()\n\n        // with kravis\n//        waitingLine.queueLengthMonitor.display()\n//        waitingLine.lengthOfStayMonitor.display()\n\n        waitingLine.statistics.toJson().toString(2).printThis()\n\n        println(\"number reneged: $numReneged\")\n        println(\"number balked: $numBalked\")\n    }\n}\n

Let's look at some details.

cancel()\n

This makes the current component (a customer) a DATA component (and be subject to garbage collection), if the queue length is 5 or more.

The reneging is implemented after a hold of 50 minutes. If a clerk can service a customer, it will take the customer out of the waitingline and will activate it at that moment. The customer just has to check whether he/she is still in the waiting line. If so, he/she has not been serviced in time and thus will renege.

hold(50.minutes)\n\nif (waitingLine.contains(this@Customer)) {\n    waitingLine.leave(this@Customer)\n\n    numReneged++\n    printTrace(\"reneged\")\n} else {\n    passivate()\n}\n

All the clerk has to do when starting servicing a client is to get the next customer in line out of the queue (as before) and activate this customer (at time now). The effect is that the hold of the customer will end.

hold(30.minutes) \ncustomer.activate() // signal the customer that's all's done\n
"},{"location":"examples/bank_office/#bank-office-with-balking-and-reneging-resources","title":"Bank Office with Balking and Reneging (resources)","text":"

Now we show how balking and reneging can be implemented with resources.

The model code is:

////Bank3ClerksRenegingResources.kt\npackage org.kalasim.examples.bank.reneging_resources\n\n\nimport org.kalasim.*\nimport org.kalasim.monitors.printHistogram\nimport kotlin.time.Duration.Companion.minutes\n\n\n//var numBalked = LevelMonitoredInt(0)\nvar numBalked = 0\nvar numReneged = 0\n\n\nclass Customer(val clerks: Resource) : Component() {\n\n    override fun process() = sequence {\n        if(clerks.requesters.size >= 5) {\n            numBalked++\n            log(\"balked\")\n            cancel()\n        }\n\n        request(clerks, failDelay = 50.minutes)\n\n        if(failed) {\n            numReneged++\n            log(\"reneged\")\n        } else {\n            hold(30.minutes)\n            release(clerks)\n        }\n    }\n}\n\nfun main() {\n    createSimulation {\n        dependency { Resource(\"clerks\", capacity = 3) }\n\n        // register other components to  be present when starting the simulation\n        ComponentGenerator(iat = uniform(5.0, 15.0).minutes) {\n            Customer(get())\n        }\n\n        run(50000.minutes)\n\n        val clerks = get<Resource>()\n\n        // with console\n        clerks.requesters.queueLengthTimeline.printHistogram()\n        clerks.requesters.lengthOfStayStatistics.printHistogram()\n\n        // with kravis\n//        clerks.requesters.queueLengthMonitor.display()\n//        clerks.requesters.lengthOfStayMonitor.display()\n\n        println(\"number reneged: $numReneged\")\n        println(\"number balked: $numBalked\")\n    }\n}\n

As you can see, the balking part is exactly the same as in the example without resources.

For the renenging, all we have to do is add a failDelay:

request(clerks, failDelay = 50.asDist())\n

If the request is not honored within 50 time units (ticks), the process continues after that request statement. We check whether the request has failed with the built-in Component property:

iff (failed)\n    numReneged++\n

This example shows clearly the advantage of the resource solution over the passivate/activate method, in former example.

"},{"location":"examples/bank_office/#bank-office-with-states","title":"Bank Office with States","text":"

Another useful concept for modelling are states. In this case, we define a state called worktodo.

The model code is:

////Bank3ClerksState.kt\n\npackage org.kalasim.examples.bank.state\n\nimport org.apache.commons.math3.distribution.UniformRealDistribution\nimport org.kalasim.*\nimport org.koin.core.component.inject\nimport kotlin.time.Duration.Companion.minutes\n\nclass CustomerGenerator : Component() {\n\n    override fun process() = sequence {\n        while(true) {\n            Customer(get(), get())\n            hold(UniformRealDistribution(env.rg, 5.0, 15.0).minutes.sample())\n        }\n    }\n}\n\nclass Customer(val workTodo: State<Boolean>, val waitingLine: ComponentQueue<Customer>) : Component() {\n    override fun process() = sequence {\n        waitingLine.add(this@Customer)\n        workTodo.trigger(true, max = 1)\n        passivate()\n    }\n}\n\n\nclass Clerk : Component() {\n    val waitingLine: ComponentQueue<Customer> by inject()\n    val workTodo: State<Boolean> by inject()\n\n    override fun process() = sequence {\n        while(true) {\n            if(waitingLine.isEmpty())\n                wait(workTodo, true)\n\n            val customer = waitingLine.poll()\n\n            hold(32.minutes) // bearbeitungszeit\n            customer.activate()\n        }\n    }\n}\n\n\nfun main() {\n    val env = declareDependencies {\n        // register components needed for dependency injection\n        dependency { ComponentQueue<Customer>(\"waitingline\") }\n        dependency { State(false, \"worktodo\") }\n\n    }.createSimulation {\n        enableComponentLogger()\n\n        // register other components to  be present\n        // when starting the simulation\n        repeat(3) { Clerk() }\n        CustomerGenerator()\n\n    }\n\n    env.run(500.minutes)\n\n    println(env.get<ComponentQueue<Customer>>().statistics)\n    env.get<State<Boolean>>().printSummary()\n\n//    val waitingLine: ComponentQueue<Customer> = env.get()\n//    waitingLine.stats.print()\n//    waitingLine.queueLengthMonitor.display()\n}\n

Let's look at some details.

add { State(false, \"worktodo\") }\n

This defines a state with an initial value false and registers it as a dependency.

In the code of the customer, the customer tries to trigger one clerk with:

workTodo.trigger(true, max = 1)\n

The effect is that if there are clerks waiting for worktodo, the first clerk's wait is honored and that clerk continues its process after:

wait(workTodo, true)\n

Note that the clerk is only going to wait for worktodo after completion of a job if there are no customers waiting.

"},{"location":"examples/bank_office/#bank-office-with-standby","title":"Bank Office with Standby","text":"

The kalasim package contains yet another powerful process mechanism, called standby. When a component is in STANDBY mode, it will become current after each event. Normally, the standby will be used in a while loop where at every event one or more conditions are checked.

The model with standby is:

////Bank3ClerksStandby.kt\nimport org.kalasim.*\nimport org.koin.core.component.inject\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass Customer(val waitingLine: ComponentQueue<Customer>) : Component() {\n    override fun process() = sequence {\n        waitingLine.add(this@Customer)\n        passivate()\n    }\n}\n\n\nclass Clerk : Component() {\n    val waitingLine: ComponentQueue<Customer> by inject()\n\n    override fun process() = sequence {\n        while(true) {\n            while(waitingLine.isEmpty())\n                standby()\n\n            val customer = waitingLine.poll()\n            hold(32.minutes) // bearbeitungszeit\n            customer.activate()\n        }\n    }\n}\n\n\nfun main() {\n    val env = createSimulation {\n        dependency { ComponentQueue<Customer>(\"waitingline\") }\n\n        enableComponentLogger()\n\n        repeat(3) { Clerk() }\n\n        ComponentGenerator(uniform(5, 15).seconds) { Customer(get()) }\n    }\n\n    env.run(500.minutes)\n\n    env.get<ComponentQueue<Customer>>().apply {\n        printSummary()\n\n        println(statistics)\n//        lengthOfStayStatistics.display()\n    }\n}\n

In this case, the condition is checked frequently with:

while(waitingLine.isEmpty())\n    standby()\n

The rest of the code is very similar to the version with states.

Warning

It is very important to realize that this mechanism can have significant impact on the performance, as after EACH event, the component becomes current and has to be checked. In general, it is recommended to try and use states or a more straightforward passivate/activate construction.

"},{"location":"examples/bridge_game/","title":"The Bridge Game","text":"

The glass bridge is a game in the Netflix series The Squid Game. The series is Netflix's most-watched series to date, becoming the top-viewed program in 94 countries and attracting more than 142 million member households during its first four weeks from launch. (Source Wikipedia)

Spoiler Alert Don't read the article if you intend to watch the series!

Squid Game - \u00a9 Netflix 2021

In one scene in Episode 7, 16 players have to cross a bridge made of two rows of glass tiles. The bridge is 18 steps long. They have to jump to one tile per row, but just one tile will last whereas the other one is made of tempered glass, which breaks under impact. The players start in an ordered fashion, whereby players with higher numbers will avoid broken tiles. To penalize players with higher numbers, there is a time-limit after which players who have not passed the bridge have lost as well (and pay with their lives).

Disclaimer The author considers the game purely from a scientific/fictional perspective. The game as well as the concept of the series are immoral, wrong, and detestable.

Squid Game - \u00a9 Netflix 2021

Inspired by another simulation this example illustrates how to run simulations in different configurations many times to work out process parameters. Here, the key parameter of interest is the number of surviving players.

As players in the show can pick their start number, the episode - as well as the internet community - circles around the question regarding an optimal start number to optimize the chance of survival.

"},{"location":"examples/bridge_game/#model","title":"Model","text":"

To answer this question, we will model and analyze the process with kalasim. At its heart - which is its process definition - it is a very simplistic model that centers around simulating the participant's stepping on the tiles one after another while considering the learning experience of earlier participants with lower start numbers.

class SquidGame(\n    val numSteps: Int = 18,\n    val numPlayers: Int = 16,\n    val maxDuration: Int = 12 * 60\n) : Environment(randomSeed =Random.nextInt()) {\n\n    // randomization\n    val stepTime = LogNormalDistribution(rg, 3.0, 0.88)\n//    val stepTime = uniform(10,30)\n\n    val decision = enumerated(true, false)\n\n    // state\n    var stepsLeft = numSteps\n    var survivors= mutableListOf<Int>()\n\n    val numTrials: Int\n        get() = numSteps - survivors.size\n\n    val numSurvivors : Int\n       get() = survivors.size\n\n    fun playerSurvived(playerNo: Int) = survivors.contains(playerNo)\n\n    init {\n        object : Component() {\n            override fun process() = sequence {\n               queue@\n               for(player in 1..numPlayers){\n                    hold(min(stepTime(), 100.0)) // cap time at 100sec\n\n                    while(stepsLeft-- > 0){\n                        if(decision()) continue@queue\n                        hold(min(stepTime(), 100.0)) // cap time at 100sec\n                    }\n\n                    if(now > maxDuration) break\n\n                    survivors.add(player)\n                }\n            }\n        }\n    }\n}\n

Move times are modeled using a log-normal distribution with the parameters from here. Similar to the previous work, we cap the time it takes a player to make a move (or just part of it) at 100 seconds.

To get started, we can simply run the simulation with

val sim = SquidGame()\nsim.run()\n\nprintln(\"${sim.numSurvivors} survived\")\n
5 survived\n
sim.playerSurvived(13)\n
true\n
(1..18).map{ sim.playerSurvived(it)}\n
[false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, false, false]\n

The model seems fine at first glance. In particular, the impact of timing becomes visible, as the last player did not survive the game

Some players survived the game. But clearly, running it once does not tell much about the average number of survivors. So we run it many times and visualize the distribution.

val manyGames = org.kalasim.misc.repeat(10000) {\n    SquidGame().apply { run() }\n}\n\nval avgSurvivors = manyGames.map { it.numSurvivors }.average()\nprintln(\"The average number of survivors is $avgSurvivors\")\n
The average number of survivors is 5.436\n

Now since we have sampled the process, we can also easily visualize the survival count distribution

manyGames.plot(x = { numSurvivors }).geomBar().labs(\n    title = \"Outcomes of 10,000 trials\",\n    x = \"Number of survivors\",\n    y = \"Count\"\n)\n

As we learn from the plot, we have obtained predominantly uni-modal distribution with an average of around 6 and minor zero-inflation. So on average 6 players will survive the game.

"},{"location":"examples/bridge_game/#maximize-survival","title":"Maximize Survival","text":"

To better understand the process, we want to visualize the probability of survival based on the player order number.

val survivalProbByNo = (1..manyGames.first().numPlayers).map { playerNo ->\n    playerNo to manyGames.count { it.playerSurvived(playerNo) }.toDouble() / manyGames.size\n}\n\nsurvivalProbByNo.plot(x = { it.first }, y = { it.second }).geomCol().labs(\n    title = \"Probability of survival based on player order number\",\n    x = \"Player Order Number\",\n    y = \"Probability\"\n)\n

So indeed there seems a strategy to maximize your odds of survival in the game. Simply pick No13, and you may live more likely compared to any other starting number.

"},{"location":"examples/bridge_game/#game-continuation","title":"Game Continuation","text":"

Now, we calculate the probability of having less than two survivors. That's in particular relevant in the series, as the bridge game is not meant to be the last game, and at least 2 players are required to continue the games.

val probLT2Players = manyGames.count { it.numSurvivors < 2 }.toDouble() / manyGames.size\nprintln(\"The probability for less than 2 players is $probLT2Players\")\n
The probability for less than 2 players is 0.0771\n

One may wonder why the makers of the series have placed 18 steps and not more or less? What do the numbers say? What are the odds for game continuation (# survivors >2) when the number of steps is different?

To answer these questions, let's re-run the model while varying the steps. To keep things simple, we run 10,000 iterations of the game over an increasing number of steps from 10 to 30:

val stepSims = (10..30).flatMap { numSteps ->\n    org.kalasim.misc.repeat(10000) {\n        SquidGame(numSteps = numSteps).apply { run() }\n    }\n}\n\nval stepSimSummary = stepSims.groupBy { it.numSteps }.map { (steps, games) ->\n    steps to games.count { it.numSurvivors < 2 }.toDouble() / games.size\n}\n
stepSimSummary.plot(x = { it.first }, y = { it.second }).geomCol().labs(\n    title = \"Probability of having less than two remaining players\",\n    x = \"Number of bridge steps\",\n    y = \"Probability\"\n)\n

With more than 16 steps, the odds of having more than 2 players decay quickly.

"},{"location":"examples/bridge_game/#conclusion","title":"Conclusion","text":"

In this example we have explored a simple generative model. By means of simulation we have worked out an optimal strategy to survive the bridge game. But be reminded, if you ever find an invite to a squid-like game on your doorstep in times of despair , trash it, smoke it or eat it. There are better - and more fun - ways to make money, such as optimizing real-world processes with simulation and business intelligence.

For complete sources, also see the jupyter notebook. Feel welcome to get in touch for support, suggestions, and questions.

"},{"location":"examples/callcenter/","title":"Call Center","text":"

Resource planning is the bread and butter of any successful business.

Let's take a glimpse into the near future where kalasim has taken up a dominant role in the simulation industry. Hundreds of happy customers are utilizing the support hotline 24/7 from around the globe to obtain professional simulation assistance. Envision a customer service department, where a steady stream of customer requests come in, and the customer service agents are tasked with addressing these inquiries.

Call Center (\u00a9Plantronics, CC BY-SA 3.0)

Choosing an appropriate shift model and planning shift capacity are key in this - and any successful - business operation. Due to the complex dynamics and interplay, it's often very challenging to determine capacity and pinpoint bottlenecks in such systems on paper.

Here is how the envisioned call center functions:

  • The requests arrive throughout the day and are queued and pooled, waiting for an available responder.
  • The responders are available in two shifts, excluding weekends. Ideally, the two shifts should not have separate queues since there is already a pooled queue.
  • If a responder from Shift A is working on a request but is about to end their shift, they will hand over the request they are working on to Shift B.
  • Shifts A and B will have different capacities to mimic day/night shift regimes.

Except for weekends, when there are no available shifts, the first available responder the following week will handle the unattended requests.

To get started, let's initialize the environment by loading the latest version of kalasim:

@file:Repository(\"*mavenLocal\")\n\n%useLatestDescriptors on\n\n@file:DependsOn(\"com.github.holgerbrandl:kalasim:0.12-SNAPSHOT\")\n@file:DependsOn(\"com.github.holgerbrandl:kravis:0.9.95\")\n
"},{"location":"examples/callcenter/#shift-system","title":"Shift System","text":"

To engineer a discrete event simulation for this particular business process, we begin by implementing the shift system. Technically, we use a sequence builder to create a weekly shift sequence that is repeated, allowing the subsequent model to run indefinitely.

enum class ShiftID { A, B, WeekEnd }\n\nval shiftModel = sequence {\n    while(true) {\n        repeat(5) { yield(ShiftID.A); yield(ShiftID.B) }\n        yield(ShiftID.WeekEnd)\n    }\n}\n
"},{"location":"examples/callcenter/#customer-inquiries","title":"Customer Inquiries","text":"

Now, we model the customer requests as simulation entities. Each request is modelled as a Component with a dedicated small lifecycle where the call center agent is requested. The actual process time varies; it is exponentially distributed with an average of around 25 minutes.

class Request : Component() {\n    val callCenter = get<Resource>()\n\n    override fun process() = sequence {\n        request(callCenter, capacityLimitMode = CapacityLimitMode.SCHEDULE) {\n            hold(exponential(25.minutes).sample())\n        }\n    }\n}\n
"},{"location":"examples/callcenter/#shift-manager","title":"Shift Manager","text":"

Next, we need to model the call center manager to modulate the shift (or in simulation speak resource) capacity dynamically.

class ShiftManager : Component() {\n    val shiftIt = shiftModel.iterator()\n    val callCenter = get<Resource>()\n\n    override fun repeatedProcess() = sequence {\n        val currentShift = shiftIt.next()\n\n        log(\"starting new shift ${currentShift}\")\n\n        // adjust shift capacity at the beginning of the shift\n        callCenter.capacity = when(currentShift) {\n            ShiftID.A -> 2.0\n            ShiftID.B -> 5.0\n            ShiftID.WeekEnd -> 0.0\n        }\n\n        // wait for end of shift\n        hold(if(currentShift == ShiftID.WeekEnd) 48.hours else 12.hours)\n    }\n}\n
"},{"location":"examples/callcenter/#simulation-environment","title":"Simulation Environment","text":"

Finally, we integrate everything into a simulation environment for easy experimentation. To facilitate convenient experimentation with various configurations and decision policies, we maintain the Shift Manager as an abstract entity, obliging the simulator to incorporate a specific implementation to conduct an experiment.

abstract class CallCenter(\n    val interArrivalRate: Duration = 10.minutes,\n    logEvents: Boolean = false\n) :\n    Environment(\n        enableComponentLogger = logEvents,\n        // note tick duration is just needed here to simplify visualization\n        tickDurationUnit = DurationUnit.HOURS\n    ) {\n\n    // intentionally not defined at this point\n    abstract val shiftManager: Component\n\n    val serviceAgents = dependency { Resource(\"Service Agents\") }\n\n    init {\n        ComponentGenerator(iat = exponential(interArrivalRate)) { Request() }\n    }\n}\n

Let's run the model for a month

val sim = object : CallCenter() {\n    override val shiftManager = ShiftManager()\n}\n\nsim.run(30.days)\n

To understand the dynamics of the model, we could now try inpspecting its progression. First we check out the queue length

sim.serviceAgents.requesters.queueLengthTimeline.display()\n

What can we discern from this? Following an initial warm-up during the first week of January, there is a noticeable increase in requests accumulating over the weekend. These requests then undergo processing over the next five business days. While customers might experience a short wait, their requests are ultimately addressed. Therefore, based on queuing theory, the system is stable and does not result in an infinite queue length.

"},{"location":"examples/callcenter/#model-accuracy-during-shift-handover","title":"Model Accuracy During Shift Handover","text":"

Clearly, this first version has the limitation that tasks overlapping with a shift-change do not immediately respect changes in capacity. That is, when shifting from a highly-staffed shift to a lesser-staffed shift, ongoing tasks will be completed regardless of the reduced capacity.

It's not straightforward to cancel these tasks and request them again in the next shift. This is because a release() will, by design, check if new requests could be served. So, ongoing tasks could be easily released, but re-requesting them - even with higher priority - would lead them to be processed slightly later than the requests that were immediately approved.

To elegantly solve this problem, we can use two other methods - interrupt() and standby(). With interrupt(), we can stop all ongoing tasks at a shift change. With standby(), we can schedule process continuation in the next simulation cycle.

For the revised model, we just need to create a different ShiftManager with our revised handover process:

class InterruptingShiftManager(\n    val aWorkers: Double = 2.0,\n    val bWorkers: Double = 5.0\n) : Component() {\n    val shiftIt = shiftModel.iterator()\n    val serviceAgents = get<Resource>()\n\n    override fun repeatedProcess() = sequence {\n        val currentShift = shiftIt.next()\n\n        log(\"starting new shift $currentShift\")\n\n        // adjust shift capacity at the beginning of the shift\n        serviceAgents.capacity = when(currentShift) {\n            ShiftID.A -> aWorkers\n            ShiftID.B -> bWorkers\n            ShiftID.WeekEnd -> 0.0\n        }\n\n        // complete hangover calls from previous shift\n        fun shiftLegacy() = serviceAgents.claimers.components\n            .filter { it.isInterrupted }\n\n        // incrementally resume interrupted tasks while respecting new capacity\n        while(shiftLegacy().isNotEmpty() && serviceAgents.capacity > 0) {\n            val numRunning = serviceAgents.claimers.components\n                .count { it.isScheduled }\n            val spareCapacity = \n                max(0, serviceAgents.capacity.roundToInt() - numRunning)\n\n            // resume interrupted tasks from last shift to max out new capacity\n            shiftLegacy().take(spareCapacity).forEach { it.resume() }\n\n            standby()\n        }\n\n        // wait for end of shift\n        hold(if(currentShift == ShiftID.WeekEnd) 48.hours else 12.hours)\n\n        // stop and reschedule the ongoing tasks\n        serviceAgents.claimers.components.forEach {\n            // detect remaining task time and request this with high prio so\n            // that these tasks are picked up next in the upcoming shift\n            it.interrupt()\n        }\n    }\n}\n

We can now instantiate a new call center with the improved hand-over process

val intSim = object: CallCenter() {\n    override val shiftManager = InterruptingShiftManager()\n}\n\n// Let's run this model for a month\nintSim.run(180.days)\n

Again we study the request queue length as indicator for system stability:

intSim.serviceAgents.requesters.queueLengthTimeline\n    .display(\"Request queue length with revised handover process\")\n

As we can see, the model is not stable. The number of support technicians is not adequate to serve the varying number of customers. Although the request frequency did not change, the more accurate shift transition modeling has impacted the result.

To determine the correct sizing - i.e., the number of service operators needed to reliably serve customers - we will increase the day staff by one support technician and repeat the experiment.

val betterStaffed = object: CallCenter() {\n    override val shiftManager = InterruptingShiftManager(bWorkers = 6.0)\n}\n\nbetterStaffed.run(90.days)\n\n\nval queueLengthTimeline = betterStaffed.serviceAgents\n    .requesters.queueLengthTimeline\n\nqueueLengthTimeline.display(\"Request queue length with revised handover process\")\n

Notably, this model has the almost the same dynamics, but is stable from a queuing perspective.

"},{"location":"examples/callcenter/#summary","title":"Summary","text":"

We have successfully modelled a variable shift length schedule and performed a sizing analysis. An initial model indicated that a weekday shift would be sufficiently staffed with 5 workers. However, a more detailed model, which also considers transition effects between shifts, led to the conclusion that 6 support technicians are required to serve the multitude of customers of Future Kalasim Inc.

Could we have solved this more elegantly using the mathematics of queuing theory? Such models are a great starting point, but usually, they very quickly fail to deliver when realistic, non-stationary requirements are considered. That's when discrete event simulation can develop its beauty and potential. Flexible shift schedules are common in many industries, and the model introduced above could be easily adjusted to account for more business constraints and processes.

The use-case was adopted from the simmer mailing list

"},{"location":"examples/car/","title":"Car","text":"

A single car, a driver, and red traffic light in the middle of the night.

Red Light, Matthias Ripp (CC BY 2.0)

Let\u2019s start with a very simple model. The example demonstrates the main mode of operation, the core API and the component process model implemented in kalasim. We want to build a simulation where a single car is driving around for a some time before stopping in front of a red traffic light.

////Cars.kts\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\n\nclass Driver : Resource()\nclass TrafficLight : State<String>(\"red\")\n\nclass Car : Component() {\n\n    val trafficLight = get<TrafficLight>()\n    val driver = get<Driver>()\n\n    override fun process() = sequence {\n        request(driver) {\n            hold(30.minutes, description = \"driving\")\n\n            wait(trafficLight, \"green\")\n        }\n    }\n}\n\ncreateSimulation {\n    enableComponentLogger()\n\n    dependency { TrafficLight() }\n    dependency { Driver() }\n\n    Car()\n}.run(5.hours)\n

For each (active) component we (can) define a type such as:

class Car : Component()\n

The class inherits from org.kalasim.Component.

Our car depends on a state TrafficLight and resource Driver for operation. To implement that, we first declare these dependencies with dependency{} in the main body of the simulation, and secondly inject them into our car with get<T>. Note, we could also directly inject states and resources with dependency {State(\"red\")} without sub-classing.

Although it is possible to define other processes within a class, the standard way is to define a generator function called process in the class. A generator is a function that returns Sequence<Component>. Within these process definitions we use suspendable interaction function calls as a signal to give control to the centralized event loop.

In this example,

hold(1.hour)\n

suspends execution control and comes back after 1 hour (of simulated time). Apart from hold, kalasim supports a rich vocabulary of interaction methods including passivate, request, wait and component.

The main body of every kalasim model usually starts with:

createSimulation{\n...\n}\n
Here, we enable event logging of state changes to see the status of simulation on the console. After declaring our dependencies, we instantiate a single car with Car(). It automatically is assigned the name Car.0.

As there is a generator function called process in Car, this process description will be activated (by default at time now, which is 0 by default at the beginning of a simulation). It is possible to start a process later, but this is by far the most common way to start a process.

With

run(5.minutes)\n

we start the simulation and get back control after 5 simulated minutes. A component called main is defined under the hood to get access to the main process.

When we run this program, we get the following output (displayed as table for convenience):

time   current  receiver  action                             info               \n------ -------- --------- ---------------------------------- -------------------\n.00             main      Created\n.00    main\n.00             Driver.1  Created                             capacity=1\n.00             Car.1     Created\n.00                       activate                           scheduled for .00\n.00             main      run +5.00                          scheduled for 5.00\n.00    Car.1    Car.1\n.00                       Requesting 1.0 from Driver.1 \n.00                       Claimed 1.0 from 'Car.1'\n.00                       Request honor Driver.1             scheduled for .00\n.00\n.00                       hold +1.00                         scheduled for 1.00\n1.00\n1.00                      entering waiters of TrafficLight.1\n1.00                      wait                               scheduled for <inf>\n5.00   main     main\nProcess finished with exit code 0\n

There are plenty of other more advanced (that is more fun!) examples listed in examples chapter.

"},{"location":"examples/car_wash/","title":"Car Wash","text":"

In this example, we'll learn how to wait for resources. The example is adopted from the SimPy example.

We simulate a carwash with a limited number of machines and a number of cars that arrive at the carwash to get cleaned. The carwash uses a resource to model the limited number of washing machines. It also defines a process for washing a car.

When a car arrives at the carwash, it requests a machine. Once it got one, it starts the carwash\u2019s wash processes and waits for it to finish. It finally releases the machine and leaves.

The cars are generated by a setup process. After creating an initial amount of cars it creates new car processes after a random time interval as long as the simulation continues.

////CarWash.kt\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.minutes\n\n/**\n *  A carwash has a limited number of washing machines and defines\n * a washing processes that takes some (random) time.\n *\n * Car processes arrive at the carwash at a random time. If one washing\n * machine is available, they start the washing process and wait for it\n * to finish. If not, they wait until they an use one.\n */\nfun main() {\n\n    val RANDOM_SEED = 42\n    val NUM_MACHINES = 2  // Number of machines in the carwash\n    val WASHTIME = 5.minutes      // Minutes it takes to clean a car\n    val T_INTER = 7.minutes       // Create a car every ~7 minutes\n    val T_INTER_SD = 2.minutes       // variance of inter-arrival\n    val SIM_TIME = 20.days     // Simulation time\n\n    class Car : Component() {\n        override fun process() = sequence {\n            val carWash = get<Resource>()\n            request(carWash)\n            hold(WASHTIME)\n            release(carWash)\n        }\n    }\n\n\n    val env = createSimulation(randomSeed = RANDOM_SEED) {\n        dependency { Resource(\"carwash\", NUM_MACHINES) }\n\n        enableComponentLogger()\n\n        //Create 4 initial cars\n        repeat(3) { Car() }\n        // Create more cars while the simulation is running\n        ComponentGenerator(iat = uniform(T_INTER - T_INTER_SD, T_INTER + T_INTER_SD)) { Car() }\n    }\n\n\n    println(\"Carwash\\n======\\n\")\n    println(\"Check out http://youtu.be/fXXmeP9TvBg while simulating ... ;-)\")\n\n    // Start the simulation\n    env.run(SIM_TIME)\n}\n
"},{"location":"examples/dining_philosophers/","title":"Dining Philosophers","text":"

The Dining Philosophers problem is a classical example in computer science to illustrate synchronisation issues in concurrent processes. It was originally formulated in 1965 by E. W. Dijkstra as a student exam exercise, and was later reworked in its current form by Tony Hoare:

Some philosophers sit at a round table with bowls of spaghetti with tomato sauce and tasty cheese. Forks are placed between each pair of adjacent philosophers.

Each philosopher must alternately think and eat. However, a philosopher can only eat spaghetti when they have both left and right forks. Each fork can be held by only one philosopher and so a philosopher can use the fork only if it is not being used by another philosopher. After an individual philosopher finishes eating, they need to put down both forks so that the forks become available to others. A philosopher can take the fork on their right or the one on their left as they become available, but cannot start eating before getting both forks.

The problem is how to design a discipline of behavior (a concurrent algorithm) such that no philosopher will starve; i.e., each can forever continue to alternate between eating and thinking, assuming no philosopher can know when others may want to eat or think.

"},{"location":"examples/dining_philosophers/#simulation","title":"Simulation","text":"

Let us define each philosopher as a process executing a thinking + eating loop, and acting concurrently on shared resources (the forks). Each process will follow a similar trajectory in which they

  1. Spend some random time thinking until they become hungry.
  2. Take one fork, when available, following a given policy.
  3. After some lag, take the other fork, when available.
  4. Spend some random time eating.
  5. Put both forks down and go back to 1.

The following function sets up a simulation of $N$ dining philosophers as established above:

//\n

To enable a strictly typed simulation, we declare the resource Fork and component Philosopher. The latter is associated to a process where the philosopher first thinks for some exponentially distributed time, takes a fork, meditates for a brief second, and finally takes the second fork once it becomes available. Both interactions modelled as requests where we use a self-releasing request context. Once the philosopher has eaten, the whole process starts over again.

A variable number of philosophers (here N=4) is instantiated and are equipped with forks on their left and right.

Our implementation follows the solution originally proposed by Dijkstra, which establishes the convention that all resources must be requested in order. This means that, in our simulation, Aristotle should pick fork 1 first instead. Without that convention, the simulation would stop soon at a point in which every philosopher holds one fork and waits for the other to be available.

Finally, we can transform the resulting monitoring data with krangl and visualize it with kravis.

See here for a jupyter notebook implementation of this example.

This example was adopted from the simmer manual.

"},{"location":"examples/emergency_room/","title":"Emergency Room","text":"

Everyone is enjoying the summer, Covid19 restrictions have been lifted, we all get back to regular exercise and outdoor activities. But once in a while, the inevitable happens: An ill-considered step, a brief second of inattention, and injuries all of all types will happen, that require immediate treatment. Luckily our city hosts a modern hospital with an efficient emergency room where the wounded are being taken care of.

To save more lives, the mayor has asked us to review and potentially improve process efficiency in the ER. To do so, we need to realize the following steps

  1. Understand the current process and model is as simulation
  2. Formulate key objectives to be optimized
  3. Assess process statistics and metrics, to unravel potential improvements to help more patients.
  4. Explore more optimized decision policies to increase

So let's dive right into it without further ado.

"},{"location":"examples/emergency_room/#process-model","title":"Process Model","text":"

Patients are classified two-fold 1. By Severity. The ER is using the well known Emergency Severity Index to triage patients based on the acuity of patients' health care problems, and the number of resources their care is anticipated to require. 2. Type of injury which are defined here

Resources

  • Surgery rooms that must be equipped by considering the type (i.e., the family) of surgery to be performed. It will take time to prepare a room for a certain type of injury. These setup times are listed in an excel sheet.
  • Doctors that are qualified for a subset of all possible injuries

Process dynamics

  • PD-A Depending on the severity, patients might die if not being treated. Also, if not being treated their severity will increase rather quickly
  • PD-B The more busy the waiting room is, the less efficient surgeries tend to be. This is because of stress (over-allocation of supporting personal and material). It is phenomenon that is often observed complex queuing processes such as manufacturing or customer services.
  • PD-C Depending on the severity, patients will die during surgery
  • PD-D The surgery time correlates with the severity of the injury
  • PD-E During nights fewer new patients arrive compared to the day

Clearly, more resources are required in the ER and many supported processes are required to run it. However, we leave these out here, as they are not considered to have a major impact on the overall process efficiency. Choosing a correct level of abstraction with a focus on key actors and resources, is the first key to success when optimizing a complex process.

"},{"location":"examples/emergency_room/#implementation","title":"Implementation","text":"

The tick-unit of the simulation is hours.

"},{"location":"examples/emergency_room/#key-objectives-observations","title":"Key Objectives & Observations","text":"

The head nurse, who is governing the process based on her long-term experience, is scheduling patients based on the following principle

Most urgent injuries first

Clearly if possible it would be great to also * Minimize waiting times * Reduce number of surgery room setups

"},{"location":"examples/emergency_room/#analysis","title":"Analysis","text":"

Because of the great variety rooms, we observe a lot of setup steps to prepare surgery rooms. Often even if patients with the same type of injury all already waiting.

"},{"location":"examples/emergency_room/#process-optimization","title":"Process Optimization","text":"

The idea for model above was orginally formulated by Kramer et al. in 2019 :

Other relevant applications arise in the context of health-care, where, for example, patients have to be assigned to surgery rooms that must be equipped by considering the type (i.e., the family) of surgery to be performed. In such cases, the weight usually models a level of urgency for the patient. */

"},{"location":"examples/emergency_room/#conclusion-summary","title":"Conclusion & Summary","text":"

In this article we have worked out a complex process with partially non-intuitive process dynamics can be modelled with kalasim and optimized using insights from operations research.

Disclaimer: The author is not a medical doctor, so please excuse possible inprecsion in wording and lack of ER process understanding. Feel welcome to suggest corrections or improvements

"},{"location":"examples/ferryman/","title":"The Ferryman","text":"

A wild river, one boat only, and a patient ferryman transporting batches of passengers across the body of water.

Covers:

  • Batching to consume queue elements in defined blocks
  • Monitors for stats and visualization

Stanhope Forbes - A Ferryman at Flushing (oil on canvas, CC0 1.0)

"},{"location":"examples/ferryman/#simulation","title":"Simulation","text":"

To form groups of passengers before passing the waters, we use batch() in the ferryman's process definition. It has multiple arguments:

  • A mandatory queue with elements of type <T> to be consumed
  • The size of the batch to be created. A positive integer is expected here.
  • An optional timeout describing how long it shall wait before forming an incomplete/empty batch

batch will return a list of type <T> of size batchSize or lesser (and potentially even empty) if timed out before filling the batch.

////Ferryman.kts\npackage org.kalasim.examples\n\nimport org.kalasim.*\nimport org.kalasim.monitors.NumericStatisticMonitor\nimport org.kalasim.plot.kravis.display\nimport kotlin.time.Duration.Companion.minutes\n\ncreateSimulation {\n\n    class Passenger : Component()\n\n    val fm = object : Component(\"ferryman\") {\n        val left2Right = ComponentQueue<Passenger>()\n        val right2Left = ComponentQueue<Passenger>()\n\n        val l2rMonitor = NumericStatisticMonitor()\n        val r2lMonitor = NumericStatisticMonitor()\n\n        override fun process() = sequence {\n            val batchLR: List<Passenger> = batch(left2Right, 4, timeout = 10.minutes)\n            l2rMonitor.addValue(batchLR.size)\n            hold(5.minutes, description = \"shipping ${batchLR.size} l2r\")\n\n            val batchRL: List<Passenger> = batch(right2Left, 4, timeout = 10.minutes)\n            r2lMonitor.addValue(batchRL.size)\n            hold(5.minutes, description = \"shipping ${batchRL.size} r2l\")\n\n            // we could also use an infinite while loop instead of activate\n            activate(process = Component::process)\n        }\n    }\n\n    ComponentGenerator(uniform(0, 15).minutes) { Passenger() }\n        .addConsumer { fm.left2Right.add(it) }\n\n    ComponentGenerator(uniform(0, 12).minutes) { Passenger() }\n        .addConsumer { fm.right2Left.add(it) }\n\n    run(10000.minutes)\n\n    fm.l2rMonitor.display(\"Passengers left->right\")\n    fm.r2lMonitor.display(\"Passengers right->left\")\n}\n
"},{"location":"examples/ferryman/#analysis","title":"Analysis","text":"

The ferryman tries to max out his boat with 4 passengers, but after 10 minutes he will start anyway (even if the boat is entirely emtpy). kalasim will suspend execution when using batch() until timeout or indefinitely (if timeout is not set).

Since both banks have different arrival distributions, we observe different batch-size patterns:

Right\u2192Left

Since passengers on the right bank arrive with a higher rate (that is shorter inter-arrival time between 0 and 12), the ferry is usually packed with people. Only occasionally the ferryman traverses from left to right banks with less than 4 passengers.

Left\u2192Right

Because of a slightly higher inter-arrival time (up to 15 minutes) on the left banks, it often happens that the ferry starts its journey across the river with some seats unoccupied. On average, just 3 seats are taken. However, at least during this simulation we did not encounter a passing with just the ferryman and his thoughts.

"},{"location":"examples/gas_station/","title":"Gas Station","text":"

This example models a gas station and cars that arrive at the station for refueling.

Covers:

  • Depletable Resources
  • Process Interaction, in particular waiting for other processes

The gas station has a limited number of fuel pumps, and a fuel tank that is shared between the fuel pumps. The gas pumps are modeled as Resource. The shared fuel tank is modeled with a DepletableResource.

Vintage Gas Pump, (CCO 1.0)

Vehicles arriving at the gas station first request a fuel pump from the station. Once they acquire one, they try to take the desired amount of fuel from the fuel pump. They leave when they are done.

The gas stations fuel level is regularly monitored by gas station control. When the level drops below a certain threshold, a tank truck is called to refuel the gas station itself.

The example is a true classic and its implementation below was adopted from salabim's and SimPy's gas stations.

To begin with, we declare required dependencies. Only kalasim (for obvious reasons) and kravis (for visualization) are needed here.

//@file:Repository(\"*mavenLocal\")\n//@file:DependsOn(\"com.github.holgerbrandl:kalasim:0.7-SNAPSHOT\")\n\n// TODO Update to v0.8\n@file:DependsOn(\"com.github.holgerbrandl:kalasim:0.7.90\")\n@file:DependsOn(\"com.github.holgerbrandl:kravis:0.8.1\")\n

Next, we import required classes.

import org.kalasim.*\nimport org.kalasim.monitors.printHistogram\nimport org.koin.core.component.inject\nimport org.koin.core.qualifier.named\n

Define configuration and constants to be use in simulation model are grouped into a dedicated section.

val GAS_STATION_SIZE = 200.0  // liters\nval THRESHOLD = 25.0  // Threshold for calling the tank truck (in %)\nval FUEL_TANK_SIZE = 50.0  // liters\nval FUEL_TANK_LEVEL_RANGE = 5.. 25\nval REFUELING_SPEED = 2.0  // liters / second\nval TANK_TRUCK_TIME = 300.0  // Seconds it takes the tank truck to arrive\nval INTER_ARRIVAL_TIME_RANGE = 10..100  // Create a car every [min, max] seconds\nval SIM_TIME = 20000.0  // Simulation time in seconds\n

Now, we implement the domain model by detailing out the lifecycle processes of the cars and the gasoline trucks.

val FUEL_TANK = \"fuel_pump\"\n\n/** Arrives at the gas station after a certain delay and refuels it.*/\nclass TankTruck : Component() {\n    val fuelPump: DepletableResource by inject(qualifier = named(FUEL_TANK))\n\n    val unloaded = State(false)\n\n    override fun process() = sequence {\n        hold(TANK_TRUCK_TIME)\n\n        // fill but cap when tank is full\n//        put(fuelPump, quantity = GAS_STATION_SIZE, capacityLimitMode = CapacityLimitMode.CAP)\n\n        // same effect, but different approach is to refill the missing quantity\n        put(fuelPump, quantity = fuelPump.capacity - fuelPump.level)\n        unloaded.value = true\n    }\n}\n\n/** A car arrives at the gas station for refueling.\n*\n* It requests one of the gas station's fuel pumps and tries to get the\n* desired amount of gas from it. If the stations reservoir is\n* depleted, the car has to wait for the tank truck to arrive.\n*/\nclass Car(\n    val tankSize: Double = FUEL_TANK_SIZE,\n) : Component() {\n\n    // Sample an initial level\n    val fuelTankLevel = discreteUniform(FUEL_TANK_LEVEL_RANGE)()\n\n    // Resolve dependencies\n    val fuelPump = get<Resource>()\n    val stationTank: DepletableResource by inject(qualifier = named(FUEL_TANK))\n\n    override fun process() = sequence {\n        request(fuelPump, description = \"waiting for free pump\") {\n            val litersRequired = tankSize - fuelTankLevel\n\n            take(stationTank, quantity = litersRequired)\n            hold(litersRequired / REFUELING_SPEED)\n            println(\"finished $name\")\n        }\n    }\n}\n

To conclude the implementation, we bind domain entities into simulation environment. To do so we add a component generator to provide new customers, and a anonymous component to realize a control process that will order a new tank-trunk if the station starts running low on gasoline supply.

class GasStation : Environment(false) {\n    val tank = dependency(qualifier = named(FUEL_TANK)) { DepletableResource(FUEL_TANK, GAS_STATION_SIZE) }\n\n    val fuelPumps = dependency { Resource(capacity = 2) }\n\n    init {\n        // Generate new cars that arrive at the gas station.\n        ComponentGenerator(iat = with(INTER_ARRIVAL_TIME_RANGE) { uniform(first, last) }) { Car() }\n\n        //Periodically check the level of the *fuel_pump* and call the tank truck if the level falls below a threshold.\n        object : Component(\"gas_station_control\") {\n            override fun repeatedProcess() = sequence {\n                // Order a new truck if the fuel-pump runs of out fuel\n                if(tank.level / tank.capacity * 100 < THRESHOLD) {\n                    log(\"Running out of fuel (remaining ${tank.level}). Ordering new fuel truck...\")\n                    wait(TankTruck().unloaded, true)\n                }\n\n                hold(10) // check every 10 seconds\n            }\n        }\n    }\n}\n
Back-end (JVM) Internal error: Failed to generate expression: KtNameReferenceExpression\nFile being compiled: (2,45) in Line_6.jupyter-kts\nThe root cause java.lang.UnsupportedOperationException was thrown at: org.jetbrains.kotlin.codegen.context.ConstructorContext.getOuterExpression(ConstructorContext.java:65)\n

Note: This is currently broken until https://github.com/Kotlin/kotlin-jupyter/issues/126 becomes fixed.

Here, we use both lazy injection with inject<T>() and instance retrieval with get<T>(). For details see koin reference

Let's run the simulation

val gasStation = GasStation()\n\ngasStation.run(SIM_TIME)\n
Line_6$GasStation\n\njava.lang.NoClassDefFoundError: Line_6$GasStation\n\n    at Line_7.<init>(Line_7.jupyter-kts:1)\n\n    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)\n\n    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)\n\n    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)\n\n    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)\n\n    at kotlin.script.experimental.jvm.BasicJvmScriptEvaluator.evalWithConfigAndOtherScriptsResults(BasicJvmScriptEvaluator.kt:100)\n\n    at kotlin.script.experimental.jvm.BasicJvmScriptEvaluator.invoke$suspendImpl(BasicJvmScriptEvaluator.kt:47)\n\n    at kotlin.script.experimental.jvm.BasicJvmScriptEvaluator.invoke(BasicJvmScriptEvaluator.kt)\n\n    at kotlin.script.experimental.jvm.BasicJvmReplEvaluator.eval(BasicJvmReplEvaluator.kt:49)\n\n    at org.jetbrains.kotlinx.jupyter.repl.impl.InternalEvaluatorImpl$eval$resultWithDiagnostics$1.invokeSuspend(InternalEvaluatorImpl.kt:99)\n\n    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)\n\n    at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)\n\n    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)\n\n    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:85)\n\n    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59)\n\n    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)\n\n    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:38)\n\n    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)\n\n    at org.jetbrains.kotlinx.jupyter.repl.impl.InternalEvaluatorImpl.eval(InternalEvaluatorImpl.kt:99)\n\n    at org.jetbrains.kotlinx.jupyter.repl.impl.CellExecutorImpl$execute$1$result$1.invoke(CellExecutorImpl.kt:64)\n\n    at org.jetbrains.kotlinx.jupyter.repl.impl.CellExecutorImpl$execute$1$result$1.invoke(CellExecutorImpl.kt:63)\n\n    at org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl.withHost(repl.kt:603)\n\n    at org.jetbrains.kotlinx.jupyter.repl.impl.CellExecutorImpl.execute(CellExecutorImpl.kt:63)\n\n    at org.jetbrains.kotlinx.jupyter.repl.CellExecutor$DefaultImpls.execute$default(CellExecutor.kt:13)\n\n    at org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl$evalEx$1.invoke(repl.kt:423)\n\n    at org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl$evalEx$1.invoke(repl.kt:412)\n\n    at org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl.withEvalContext(repl.kt:376)\n\n    at org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl.evalEx(repl.kt:412)\n\n    at org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl.eval(repl.kt:460)\n\n    at org.jetbrains.kotlinx.jupyter.ProtocolKt$shellMessagesHandler$res$1.invoke(protocol.kt:291)\n\n    at org.jetbrains.kotlinx.jupyter.ProtocolKt$shellMessagesHandler$res$1.invoke(protocol.kt:290)\n\n    at org.jetbrains.kotlinx.jupyter.JupyterConnection$runExecution$execThread$1.invoke(connection.kt:166)\n\n    at org.jetbrains.kotlinx.jupyter.JupyterConnection$runExecution$execThread$1.invoke(connection.kt:164)\n\n    at kotlin.concurrent.ThreadsKt$thread$thread$1.run(Thread.kt:30)\n

Analyze the dynamics of the model

// or accessor\nval tank = gasStation.tank\n\n// print some stats\ntank.levelTimeline.printHistogram()\n\ntank.levelTimeline.display().show()\n

Also inspect if the gas station is equipped with enough gas pumps to serve customers

gasStation.fuelPumps.claimedTimeline.display()\n
Line_9.jupyter-kts (1:1 - 11) Unresolved reference: gasStation\n
"},{"location":"examples/gas_station/#conclusion","title":"Conclusion","text":"

In this example we have explored how a depletable resource can be consumed by multipler clients.

"},{"location":"examples/machine_parts/","title":"Machine Parts","text":"

This model demonstrates the use of stacked interrupts. It is adopted from here.

Each of two machines has three parts, that will be subject to failure. If one or more of these parts has failed, the machine is stopped. Only when all parts are operational, the machine can continue its work (hold).

For a machine to work it needs the resource. If, during the requesting of this resource, one or more parts of that machine break down, the machine stops requesting until all parts are operational.

In this model the interrupt level frequently gets to 2 or 3 (all parts broken down).

Have a close look at the trace output to see what is going on.

////MachineWithParts.kt\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.hours\nimport kotlin.time.Duration.Companion.minutes\n\nclass Part(val machine: Machine, partNo: Int) :\n    Component(\n        name = machine.name.replace(\"Machine\", \"part\") + \".${partNo + 1}\"\n    ) {\n\n    val ttf = uniform(19.hours, 20.hours) // time to failure distribution\n    val ttr = uniform(3.hours, 6.hours)  //  time to repair distribution\n\n    override fun process() = sequence {\n        while(true) {\n            hold(ttf())\n            machine.interrupt()\n            hold(ttr())\n            machine.resume()\n        }\n    }\n}\n\n\nclass Machine : Component() {\n\n    init {\n        repeat(3) { Part(this, it) }\n    }\n\n    override fun process() = sequence {\n        while(true) {\n            val r = get<Resource>()\n            request(r)\n            hold(5.minutes)\n            release(r)\n        }\n    }\n}\n\nfun main() {\n    createSimulation {\n        enableComponentLogger()\n\n        dependency { Resource() }\n        repeat(2) { Machine() }\n\n        run(400.hours)\n    }\n}\n
"},{"location":"examples/machine_shop/","title":"Machine Shop","text":"

In this example, we'll learn how to interrupt a process because of more important tasks. The example is adopted from the SimPy Machine Shop Example.

The example covers interrupt and preemptive resources.

The example comprises a workshop with n identical machines. A stream of jobs (enough to keep the machines busy) arrives. Each machine breaks down periodically. Repairs are carried out by one repairman. The repairman has other, less important tasks to perform, too. Broken machines preempt these tasks. The repairman continues them when he is done with the machine repair. The workshop works continuously.

A machine has two processes:

  1. working implements the actual behaviour of the machine (producing parts).
  2. break_machine periodically interrupts the working process to simulate the machine failure.

In kalasim there can only be one generating process per component. So to model the wear, we use a separate MachineWear which is interrupting the machine in case of failure.

The repairman\u2019s other job is also a process (implemented by otherJob). The repairman itself is a preemptive resource with a capacity of 1. The machine repairing has a priority of 1, while the other job has a priority of 2 (the smaller the number, the higher the priority).

////MachineShop.kt\nimport org.kalasim.*\nimport kotlin.time.Duration.Companion.days\nimport kotlin.time.Duration.Companion.minutes\n\n\nval RANDOM_SEED: Int = 42\nval PT_MEAN = 10.minutes // Avg. processing time in minutes\nval PT_SIGMA = 2.minutes // Sigma of processing time\nval MTTF = 300.minutes // Mean time to failure in minutes\nval REPAIR_TIME = 30.minutes // Time it takes to repair a machine in minutes\nval JOB_DURATION = 30.minutes // Duration of other jobs in minutes\nval NUM_MACHINES: Int = 10   // Number of machines in the machine shop\nval SIM_TIME = 28.days  // Simulation time\n\nfun main() {\n\n    class Machine : Component() {\n        var madeParts: Int = 0\n            private set\n\n        val timePerPart: DurationDistribution = normal(PT_MEAN, PT_SIGMA)\n\n        override fun process(): Sequence<Component> = sequence {\n            while(true) {\n                // start working on a new part\n                log(\"building a new part\")\n                hold(timePerPart())\n                log(\"finished building part\")\n                madeParts++\n            }\n        }\n    }\n\n\n    /** Break the machine every now and then. */\n    class MachineWear(val machine: Machine, val repairMan: Resource) : Component(\n        process = MachineWear::breakMachine\n    ) {\n\n\n        fun breakMachine(): Sequence<Component> = sequence {\n            val timeToFailure = exponential(MTTF)\n\n            while(true) {\n                hold(timeToFailure())\n\n                // handle the rare case that the model\n                if(machine.isInterrupted) continue\n\n                machine.interrupt()\n\n                request(repairMan)\n                hold(REPAIR_TIME)\n\n                require(!isBumped(repairMan)) { \"productive tools must not be bumped\" }\n\n                release(repairMan)\n\n                machine.resume()\n                require(!machine.isInterrupted) { \"machine must not be interrupted at end of wear cycle\" }\n            }\n        }\n    }\n\n\n    createSimulation(randomSeed = RANDOM_SEED) {\n        enableComponentLogger()\n\n        val repairMan = Resource(\"mechanic\", preemptive = true)\n\n\n        // create N machines and wear components\n        val tools = (1..NUM_MACHINES).map {\n            Machine().also { MachineWear(it, repairMan) }\n        }\n\n        // define the other jobs as object expression\n        // https://kotlinlang.org/docs/reference/object-declarations.html#object-expressions\n        object : Component(\"side jobs\") {\n            override fun process() = sequence {\n                while(true) {\n                    request(ResourceRequest(repairMan, priority = Priority(-1)))\n                    hold(JOB_DURATION)\n\n                    if(isBumped(repairMan)) {\n                        log(\"other job was bumped\")\n                        continue\n                    }\n\n                    release(repairMan)\n                }\n            }\n        }\n\n        // Run simulation\n        run(1000.minutes)\n        run(SIM_TIME)\n\n        // Analysis\n\n        tools.forEach { println(\"${it.name} made ${it.madeParts} parts.\") }\n    }\n}\n
"},{"location":"examples/movie_theater/","title":"Movie Theater","text":"

Covers:

  • Resources
  • Event operators
  • Shared events

This example models a movie theater with one ticket counter selling tickets for three movies (next show only). People arrive at random times and try to buy a random number (1\u20136) tickets for a random movie. When a movie is sold out, all people waiting to buy a ticket for that movie renege (leave the queue).

The movie theater is just a type to assemble all the related data (movies, the counter, tickets left, collected data, ...). The counter is a Resource with a capacity of one.

The moviegoer process function starts waiting until either it\u2019s his turn (it acquires the counter resource) or until the sold out signal is triggered. If the latter is the case it reneges (leaves the queue). If it gets to the counter, it tries to buy some tickets. This might not be successful, e.g. if the process tries to buy 5 tickets but only 3 are left. If less than two tickets are left after the ticket purchase, the sold out signal is triggered.

Moviegoers are generated by the customer arrivals process. It also chooses a movie, and the number of tickets for the moviegoer.

////MovieRenege.kt\nimport org.kalasim.*\nimport org.kalasim.misc.roundAny\nimport kotlin.time.Duration.Companion.minutes\n\nfun main() {\n\n    val RANDOM_SEED = 158\n    val TICKETS = 50  // Number of tickets per movie\n    val SIM_TIME = 120.minutes  // Simulate until\n\n    data class Movie(val name: String)\n\n    val MOVIES = listOf(\"Julia Unchained\", \"Kill Process\", \"Pulp Implementation\").map { Movie(it) }\n\n    createSimulation(randomSeed = RANDOM_SEED) {\n        enableComponentLogger()\n\n        // note: it's not really needed to model the theater (because it has no process), but we follow the julia model here\n        val theater = object {\n            val tickets =\n                MOVIES.associateWith { DepletableResource(\"room ${MOVIES.indexOf(it)}\", capacity = TICKETS) }\n            val numReneged = MOVIES.associateWith { 0 }.toMutableMap()\n            val counter = Resource(\"counter\", capacity = 1)\n        }\n\n        class Cineast(val movie: Movie, val numTickets: Int) : Component() {\n            override fun process() = sequence {\n                request(theater.counter) {\n                    request(theater.tickets[movie]!! withQuantity numTickets, failAt = 0.simTime)\n                    if(failed) {\n                        theater.numReneged.merge(movie, 1, Int::plus)\n                    }\n                }\n            }\n        }\n\n        ComponentGenerator(iat = exponential(0.5.minutes)) {\n            Cineast(MOVIES.random(), discreteUniform(1, 6).sample())\n        }\n\n        run(SIM_TIME)\n\n        MOVIES.forEach { movie ->\n            val numLeftQueue = theater.numReneged[movie]!!\n            val soldOutSince = theater.tickets[movie]!!.occupancyTimeline.stepFun()\n                // find the first time when tickets were sold out\n                .first { it.value == 1.0 }.time.toTickTime().value.roundAny(2)\n\n            println(\"Movie ${movie.name} sold out $soldOutSince minutes after ticket counter opening.\")\n            println(\"$numLeftQueue walked away after film was sold out.\")\n        }\n\n//        // Visualize ticket sales\n//        val plotData = theater.tickets.values.flatMap {\n//            it.occupancyTimeline.stepFun().map { sf -> Triple(it.name, sf.first, sf.second) }\n//        }\n//\n//        plotData.toDataFrame().plot(x = \"second\", y = \"third\")\n//            .geomStep().facetWrap(\"first\").title(\"Theater Occupancy\")\n//            .xLabel(\"Time (min)\").yLabel(\"Occupancy\")\n    }\n}\n

The example also details out how we could now easily plot the occupancy progressions using automatically captured monitoring data.

Adopted from SimJulia example.

"},{"location":"examples/office_tower/","title":"Office Tower","text":"

In this logistics model, we simulate an office tower. There are N lifts with capacity limited cars. Passengers arrive at different floors with different rates and press buttons indicating the direction of their target floor. The cars have a defined speed, and clearly it takes time to open/close its doors before passengers can enter & leave.

Parameters

  • Origin/destination distribution of visitors
  • Number of elevators
  • Capacity of each elevator
  • Number of floors
  • Times for moving between floors, for opening/closing doors, and for passenger to move or out a car
"},{"location":"examples/office_tower/#implementation","title":"Implementation","text":"

See Elevator.kt for the implementation.

The implementation is adopted from salabim's elevator example.

"},{"location":"examples/office_tower/#model","title":"Model","text":"

The following diagram shows the key players of the model. The diagram was automatically created using Intellij's UML capabilities.

The simulation environment is modelled in Elevator. Multiple VisitorGenerators produce Visitors at different rates. Each visitor has a target Floor, which defines the button (up or down) she is pressing to request a car. Cars - i.e. the elevator cabins - are the workhorse of the model. They have a fixed capacity, a current occupancy, a current floor and a state for the door. The cars and the visitors have associated process definitions to drive the dynamics of the model.

"},{"location":"examples/office_tower/#process-animation","title":"Process Animation","text":"

The model was also animated (source) to illustrate the power of kalasim's animation API.

"},{"location":"examples/traffic/","title":"Traffic","text":"

The following example integrates three simulation entities

  • A gas station with a limited number of pumps
  • A traffic light that prevents cars from driving
  • Multiple cars that need to pass the cross with the traffic light to reach a gas station. There each car needs to refill before it is reaching its end of live within the simulation context.

The example illustrates how to establish a simple interplay of states and resources. It is realized elegantly with dependency injection.

////Traffic.kts\nimport org.kalasim.*\nimport org.koin.core.component.inject\n\nenum class TrafficLightState { RED, GREEN }\n\n/** A traffic light with 2 states. */\nclass TrafficLight : State<TrafficLightState>(TrafficLightState.RED) {\n\n    fun toggleState() {\n        when(value) {\n            TrafficLightState.RED -> TrafficLightState.GREEN\n            TrafficLightState.GREEN -> TrafficLightState.RED\n        }\n    }\n}\n\n\n/** A simple controller that will toggle the state of the traffic-light */\nclass TrafficLightController(val trafficLight: TrafficLight) : Component() {\n\n    override fun repeatedProcess() = sequence {\n        hold(6)\n        trafficLight.toggleState()\n    }\n}\n\n/** A gas station, where cars will stop for refill. */\nclass GasStation(numPumps: Int = 6) : Resource(capacity = numPumps)\n\n/** A car with a process definition detailing out its way to the gas-station via a crossing. */\nclass Car(val trafficLight: TrafficLight) : Component() {\n\n    val gasStation by inject<GasStation>()\n\n    override fun process() = sequence {\n        // Wait until the traffic light is green\n        wait(trafficLight, TrafficLightState.GREEN)\n\n        // Request a slot in the gas-station\n        request(gasStation) {\n            hold(5, description = \"refilling\")\n        }\n    }\n}\n\ncreateSimulation {\n    enableComponentLogger()\n\n    // Add a traffic light so that we can refer to it via koin get<T>()\n    dependency { TrafficLight() }\n\n    // Also add a resource with a limited capacity\n    dependency { GasStation(2) }\n\n    // Setup a traffic light controller to toggle the light\n    TrafficLightController(get())\n\n    // Setup a car generator with an exponentially distributed arrival time\n    ComponentGenerator(exponential(7).minutes) { Car(get()) }\n\n    // enable component tracking for later analytics\n    val cg = componentCollector()\n\n    // Run for 30 ticks\n    run(10)\n\n    // Toggle the traffic light manually\n    get<TrafficLight>().value = TrafficLightState.GREEN\n\n    // Run for another 10 ticks\n    run(10)\n\n    // Assess the state of the simulation entities\n    cg.filterIsInstance<Car>().first().stateTimeline.printHistogram()\n    get<GasStation>().printStatistics()\n}\n

Here, we use both lazy injection with inject<T>() and instance retrieval with get<T>(). For details see koin reference

"},{"location":"examples/shipyard/bom_example/","title":"Bom example","text":"

Hull Components:

1.Steel Plates (Quantity: 20)

2.Bulkheads (Quantity: 5)

3.Frames (Quantity: 15)

4.Keel (Quantity: 1)

Engines:

1.Main Engine (Quantity: 2)

2.Auxiliary Engines (Quantity: 3)

Electrical Systems:

  • Generators:

1.Diesel Generators (Quantity: 2)

2.Emergency Generator (Quantity: 1)

  • Cabling and Wiring:

1.Electrical Cables (Quantity: 500 meters)

2.Wiring Harnesses (Quantity: 50)

  • Switchgear:

1.Circuit Breakers (Quantity: 30)

2.Switch Panels (Quantity: 10)

Navigation Equipment:

1.Radar Systems (Quantity: 2)

2.GPS Navigation Units (Quantity: 1)

3.Compass (Quantity: 1)

Safety Equipment:

1.Lifeboats (Quantity: 4)

2.Life Jackets (Quantity: 50)

3.Fire Extinguishers (Quantity: 10)

Interior Fixtures:

1.Cabin Furniture (Quantity: 10 sets)

2.Galley Equipment (Quantity: 1 set)

Deck Machinery:

1.Cranes (Quantity: 2)

2.Winches (Quantity: 4)

Miscellaneous:

1.Paint (Quantity: 50 gallons)

2.Nuts, Bolts, and Fasteners (Quantity: Assorted)

"},{"location":"examples/shipyard/shipyard/","title":"Bill of Materials (BOM) in Ship Final Assembly: A Key Component of Efficient Production","text":""},{"location":"examples/shipyard/shipyard/#introduction","title":"Introduction","text":"

The production process of complex structures such as ships involves meticulous planning, precision, and coordination of various components and materials. A crucial tool in this process is the Bill of Materials (BOM), which serves as a comprehensive document that outlines the list of components, materials, and parts required for the final assembly of a ship. In this article, we will explore how BOMs are used in ship final assembly, highlighting their importance in ensuring a smooth and efficient production process.

"},{"location":"examples/shipyard/shipyard/#what-is-a-bill-of-materials-bom","title":"What is a Bill of Materials (BOM)?","text":"

A Bill of Materials (BOM) is a structured list of all the items, components, and materials necessary to manufacture a product or assemble a final product, like a ship. It details each part's name, quantity, specifications, and the relationship between them. BOMs are crucial for coordinating various aspects of production, from sourcing materials to managing inventory and tracking costs.

"},{"location":"examples/shipyard/shipyard/#the-role-of-boms-in-ship-final-assembly","title":"The Role of BOMs in Ship Final Assembly","text":"

Inventory Management: BOMs help shipbuilders keep track of all the components needed for assembly. This allows for efficient inventory management, ensuring that the right materials are available when needed, minimizing delays in production.

Quality Assurance: BOMs also include specifications and quality requirements for each component. This ensures that only the approved parts are used, reducing the likelihood of defects or safety issues in the final product.

Cost Estimation: By providing a detailed list of materials and components, BOMs are invaluable in cost estimation and budgeting. They allow shipbuilders to calculate the overall production costs accurately, ensuring that the project remains within budget.

Sourcing and Procurement: BOMs are used to create purchase orders for required materials and components. This helps streamline the procurement process, ensuring that the right parts are ordered in the correct quantities and from approved suppliers.

Assembly Planning: BOMs serve as a roadmap for the assembly process. They help in organizing the assembly line and ensuring that workers have access to the necessary components in the right order, reducing assembly time and improving efficiency.

"},{"location":"examples/shipyard/shipyard/#example-ship-final-assembly","title":"Example: Ship Final Assembly","text":"

Let's consider the assembly of a cargo ship as an example. The ship's BOM would include a detailed list of all components, such as the hull, engines, electrical systems, navigation equipment, and more. Each of these components would have its own sub-BOMs, breaking down further into individual parts. For instance, the electrical system's sub-BOM might include cables, switches, and circuit boards, specifying the quantity, specifications, and suppliers for each.

By having a well-structured BOM for the cargo ship, the shipbuilder can ensure that all components are available on time, that quality standards are met, and that the assembly process is efficient. This not only reduces the production timeline but also increases the overall quality and safety of the final product.

How would a typical BOM in cargo ship final assembly look like

"},{"location":"examples/shipyard/shipyard/#conclusion","title":"Conclusion","text":"

Bill of Materials (BOMs) are an essential tool in the production process, especially in the complex field of ship assembly. They provide a detailed and organized overview of the materials and components required for final assembly, allowing for efficient management of inventory, quality assurance, cost estimation, and assembly planning. In shipbuilding, BOMs play a crucial role in ensuring that the final product is not only completed on time but also meets the highest quality and safety standards.

"}]} \ No newline at end of file diff --git a/setup/index.html b/setup/index.html new file mode 100644 index 00000000..c927b4ab --- /dev/null +++ b/setup/index.html @@ -0,0 +1,1939 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Setup - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Installation

+

kalasim requires Java11 or higher.

+

Gradle

+

To get started simply add it as a dependency: +

dependencies {
+    implementation 'com.github.holgerbrandl:kalasim:1.0.0'
+}
+

+

Builds are hosted on maven-central supported by the great folks at sonatype.

+

Jitpack Integration

+

You can also use JitPack with Maven or Gradle to include the latest snapshot as a dependency in your project.

+
repositories {
+    maven { url 'https://jitpack.io' }
+}
+dependencies {
+        implementation 'com.github.holgerbrandl:kalasim:-SNAPSHOT'
+}
+
+

How to build it from sources?

+

To build and install it into your local maven cache, simply clone the repo and run +

./gradlew install
+

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..ce49e3d9 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,167 @@ + + + + https://www.kalasim.org/ + 2024-11-18 + + + https://www.kalasim.org/about/ + 2024-11-18 + + + https://www.kalasim.org/advanced/ + 2024-11-18 + + + https://www.kalasim.org/analysis/ + 2024-11-18 + + + https://www.kalasim.org/animation/ + 2024-11-18 + + + https://www.kalasim.org/basics/ + 2024-11-18 + + + https://www.kalasim.org/changes/ + 2024-11-18 + + + https://www.kalasim.org/collections/ + 2024-11-18 + + + https://www.kalasim.org/component/ + 2024-11-18 + + + https://www.kalasim.org/events/ + 2024-11-18 + + + https://www.kalasim.org/examples/ + 2024-11-18 + + + https://www.kalasim.org/faq/ + 2024-11-18 + + + https://www.kalasim.org/getting_started/ + 2024-11-18 + + + https://www.kalasim.org/monitors/ + 2024-11-18 + + + https://www.kalasim.org/resource/ + 2024-11-18 + + + https://www.kalasim.org/setup/ + 2024-11-18 + + + https://www.kalasim.org/state/ + 2024-11-18 + + + https://www.kalasim.org/theory/ + 2024-11-18 + + + https://www.kalasim.org/visualization/ + 2024-11-18 + + + https://www.kalasim.org/animation/lunar_mining/ + 2024-11-18 + + + https://www.kalasim.org/articles/2021-11-27-kalasim-v07/ + 2024-11-18 + + + https://www.kalasim.org/articles/2022-09-27-kalasim-v08/ + 2024-11-18 + + + https://www.kalasim.org/articles/2022-11-25-kalasim-at-wsc22/ + 2024-11-18 + + + https://www.kalasim.org/articles/articles/ + 2024-11-18 + + + https://www.kalasim.org/examples/atm_queue/ + 2024-11-18 + + + https://www.kalasim.org/examples/bank_office/ + 2024-11-18 + + + https://www.kalasim.org/examples/bridge_game/ + 2024-11-18 + + + https://www.kalasim.org/examples/callcenter/ + 2024-11-18 + + + https://www.kalasim.org/examples/car/ + 2024-11-18 + + + https://www.kalasim.org/examples/car_wash/ + 2024-11-18 + + + https://www.kalasim.org/examples/dining_philosophers/ + 2024-11-18 + + + https://www.kalasim.org/examples/emergency_room/ + 2024-11-18 + + + https://www.kalasim.org/examples/ferryman/ + 2024-11-18 + + + https://www.kalasim.org/examples/gas_station/ + 2024-11-18 + + + https://www.kalasim.org/examples/machine_parts/ + 2024-11-18 + + + https://www.kalasim.org/examples/machine_shop/ + 2024-11-18 + + + https://www.kalasim.org/examples/movie_theater/ + 2024-11-18 + + + https://www.kalasim.org/examples/office_tower/ + 2024-11-18 + + + https://www.kalasim.org/examples/traffic/ + 2024-11-18 + + + https://www.kalasim.org/examples/shipyard/bom_example/ + 2024-11-18 + + + https://www.kalasim.org/examples/shipyard/shipyard/ + 2024-11-18 + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 00000000..dab9fa03 Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/state/index.html b/state/index.html new file mode 100644 index 00000000..d585bc0e --- /dev/null +++ b/state/index.html @@ -0,0 +1,2162 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + States - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

State

+

States provide a powerful tool for process interaction.

+

A state will have a value at any given time. In its simplest form a component can wait() for a specific value of a state. Once that value is reached, the component will be resumed.

+

Examples

+ +

Usage

+

New States are defined as val doorOpen = State(false). The initial value is false, meaning +the door is closed.

+

Now we can say :

+
doorOpen.value = true
+
+

to open the door.

+

If we want a person to wait for an open door, we could say :

+
wait(doorOpen, true)
+
+

The person's process definition will be suspended until the door is open.

+

We can obtain the current value (e.g. for logging) with:

+
print("""door is ${if(doorOpen.value) "open" else "closed"}""")
+
+

The value of a state is automatically monitored in the State<T>.timeline level monitor.

+

All components waiting for a state are tracked in a (internal) queue, that can be obtained with doorOpen.waiters.

+

State Change Triggers

+

If we just want at most one person to enter, we can use trigger() (which is a simple convenience wrapper around wait) with doorOpen.trigger(true, max=1). The following will happen:

+
    +
  1. Temporarily change the state to the provided value,
  2. +
  3. Reschedule max components (or less if there are fewer/no waiters) for immediate process continuation,
  4. +
  5. and finally restore the previous state value.
  6. +
+

Type Support

+

States support generics, so we could equally well use any other type to model the value. For example, a traffic light could be modelled with a String state:

+
// initially the traffic light is red
+val light = State("red")
+...
+// toggle its value to green
+light.value = "green"
+
+

Or define a int/float state :

+
val level = State(0.0)
+
+level.value += 10
+
+

Since State<T> is a generic type, the compiler will reject invalid level associations such as +

level.value = "red"
+
+This won't compile because the type of level is Double.

+

Metrics

+

States have a number of metrics endpoints:

+
    +
  • valueMonitor tracks state changes over time
  • +
  • queueLength tracks the queue length level across time
  • +
  • lengthOfStay tracks the length of stay in the queue over time
  • +
+

Process interaction with wait()

+

A component can wait() for a state to get a certain value. In its most simple form this is done with

+
wait(doorOpen, true)
+
+

Once the doorOpen state is true, the component will be scheduled for process continuation.

+

As with request it is possible to set a timeout with failAt or failDelay :

+
wait(dooropen, true, failDelay=10.0)
+if(failed) print("impatient ...")
+
+

In this example, the process will wait at max 10 ticks. If the state predicate was not met until then, the failed flag will be set and be consumed by the user.

+

There are two ways to test for a value

+
    +
  • Value testing
  • +
  • Predicate testing
  • +
+

Value Testing

+

It is possible to test for a certain value:

+
wait(light, "green")
+
+

Or more states at once:

+

wait(light turns "green", light turns "yellow")  
+
+where the wait is honored as soon is light is green OR yellow.

+

It is also possible to wait for all conditions to be satisfied, by adding all=true:

+

wait(light turns "green", engineRunning turns true, all=true) 
+
+Here, the wait is honored as soon as light is green AND the engine is running.

+

Predicate testing

+

This is a more complicated but also more versatile way of specifying the honor-condition. In that case, a predicate function (T) -> Boolean must be provided required to specify the condition.

+

Example 1

+

val state = State("foo")
+wait(state) { listOf("bar", "test").contains(it) }
+
+The wait is honored if the String State becomes either bar or test.

+

Example 2

+
val intState = State(3.0)
+wait(intState) { it*3 < 42 }
+
+

In this last example the wait is honored as soon as the value fulfils it*3 < 42.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/stylesheets/extra.css b/stylesheets/extra.css new file mode 100644 index 00000000..07dd5828 --- /dev/null +++ b/stylesheets/extra.css @@ -0,0 +1,5 @@ +/* adopted from https://github.com/squidfunk/mkdocs-material/issues/748*/ +.center { + display: block; + margin: 0 auto; +} \ No newline at end of file diff --git a/theory/index.html b/theory/index.html new file mode 100644 index 00000000..c895958e --- /dev/null +++ b/theory/index.html @@ -0,0 +1,1956 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Theory - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+ +
+
+ + + +
+
+ + + + + + + +

Simulation Theory

+

As defined by Shannon (1975),

+
+

a simulation is the process of designing a model of a real system and conducting experiments with this model for the +purpose either of understanding the behavior of the system or of evaluating various strategies +(within the limits imposed by a criterion or a set of criteria) for the operation of the system.

+
+

What is discrete event simulation?

+

A discrete event simulation (DES) is a tool that allows studying the dynamic behavior of stochastic, dynamic and discretely evolving systems such as

+
    +
  • Factories
  • +
  • Ports & Airports
  • +
  • Traffic
  • +
  • Supply chains & Logistics
  • +
  • Controlling
  • +
+

In fact, every process that is founded on discrete state changes is suitable to be simulated with a discrete event simulation such as kalasim.

+

As described by Ucar, 2019, the discrete nature of a given system arises as soon as its behavior can be described in terms of events, which is the most fundamental concept in DES. An event is an instantaneous occurrence that may change the state of the system, while, between events, all the state variables remain.

+ +

There are several main DES paradigms. In activity-oriented DES the simulation clock advances in fixed time increments and all simulation entities are scanned and possibly reevaluated. Clearly, simulation performance degrades quickly with smaller increments and increasingly complex models.

+

In event-oriented DES is built around a list of scheduled events ordered by future execution time. During simulation, the these events are processed sequentially to update the state of the model.

+

Finally, process-oriented DES refines the event-oriented approach by defining a vocabulary of interactions to describe the interplay between simulation entities. This vocabulary is used by the modeler to define the component life-cycle processes of each simulation entity.

+ + +

Applications of discrete event simulation

+

Depending on the system in question, DES and kalasim in particular can provide insights into the process efficiency, risks or effectiveness. In addition, it allows assessing alternative what-if scenarios. Very often planning is all about estimating the effect of changes to a system. such as more/fewer driver, more/fewer machines, more/less repair cycles, more/fewer cargo trolleys.

+

Typical applications of discrete event simulations are

+
    +
  • Production planning (such as bottleneck analysis)
  • +
  • Dimensioning (How many drivers are needed? Number of servers?)
  • +
  • Process automation & visualization
  • +
  • Digital twin development
  • +
  • Project management
  • +
+

For in-depth primers about simulation see here or Ucar, 2019.

+

Other Simulation Tools

+

There are too many to be listed. In generally there are graphical tools and APIs + . Graphical tools, such as AnyLogic excel by providing a flat learning curve, great visuals but often lack interfaces for extensibility or automation. APIs are usually much more flexible but often lack an intuitive approach to actually build simulations.

+

Out of the great number of APIs, we pinpoint just those projects/products which served as source of inspiration when developing kalasim.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/timeline_example.png b/timeline_example.png new file mode 100644 index 00000000..315b1ff1 Binary files /dev/null and b/timeline_example.png differ diff --git a/visualization/index.html b/visualization/index.html new file mode 100644 index 00000000..e68b883e --- /dev/null +++ b/visualization/index.html @@ -0,0 +1,1997 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Visualization - kalasim - discrete event simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + +
+ +
+ + + + + + + + + +
+
+ + + +
+
+
+ + + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Visualization

+

There are two type of visualizations

+
    +
  • Statistical plots to inspect distributions, trends and outliers. That's what described in this chapter
  • +
  • Process rendering to actually show simulation entities, their state or position changes on a 2D (or even 3D) grid as rendered movie. This may also involve interactive controls to adjust simulation parameters. Such functionality is planned but not yet implemented in kalasim
  • +
+

Examples +* Movie Theater

+

Built-in Visualizations

+

Currently, the following extensions for distribution analysis are supported

+

Components

+

Monitors

+
    +
  • CategoryTimeline<T>.display() provides a segment chart of the level
  • +
  • FrequencyTable<T>.display() provides a barchart of the frequencies of the different values
  • +
  • NumericStatisticMonitor.display() provides histogram of the underlying distribution
  • +
  • MetricTimeline.display() provides a line chart with time on the x and the value on y
  • +
+

Resources

+
    +
  • r.activiities to show the activities as segments timeline
  • +
  • r.timeline to show the resource utilization and queuing status
  • +
  • All monitor related plots from above
  • +
+

Component Queue

+
    +
  • All monitor related plots from above
  • +
+

For monitors, see corresponding section

+

Framework Support

+

By default, kalasim supports 2 pluggable visualization backends. Currently kravis and lets-plot are supported.

+

Since we may not be able to support all visualizations in both frontends, the user can simply toggle the frontend by package import:

+
// simply toggle backend by package import
+import org.kalasim.plot.letsplot.display
+// or
+//import org.kalasim.plot.kravis.display
+
+MM1Queue().apply {
+    run(100)
+    server.claimedMonitor.display()
+}
+
+

Kravis

+

kalasim integrates nicely with kravis to visualize monitor data. For examples see src/test/kotlin/org/kalasim/analytics/KravisVis.kt.

+
+

Note

+

To visualize data with kravis, R must be installed on the system. See here) for details.

+
+

LetsPlot

+

lets-plot is another very modern visualization library that renders within the JVM and thus does not have any external dependencies. Similar to kravis it mimics the API of ggplot2.

+ + + + + + + + + + + + + +
+
+ + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file