ScaFi Aggregate Programming Toolkit
ScaFi (Scala Fields) is a Scala-based library and framework for Aggregate Programming. It implements a variant of the Higher-Order Field Calculus (HOFC) operational semantics as a domain-specific language (DSL), and provides a platform and API for simulating and executing Aggregate Computing systems and applications.
Learning Resources
- ScaFi User Manual and ScaFi Developer Manual
- hello-scafi: basic usage of ScaFi
- learning-scafi-alchemist: simulating aggregate systems with ScaFi in the Alchemist simulator
- A tutorial repository on ScaFi and aggregate computing, by G. Audrito
- A tutorial on ScaFi delivered at ACSOS 2023
Usage
ScaFi is published for Scala 3 and Scala 2.13.
scafi-commons, scafi-core, and scafi-simulator target both the JVM and JavaScript (via Scala.js);
the other modules (scafi-simulator-gui, spala, scafi-distributed) are available only for Scala 2.13 on the JVM.
1. Add the dependency to ScaFi, via sbt (build.sbt):
scalaVersion := "3.7.4" // or "2.13.18"
val scafiVersion = "1.8.0"
libraryDependencies ++= Seq(
"it.unibo.scafi" %% "scafi-core" % scafiVersion,
"it.unibo.scafi" %% "scafi-simulator" % scafiVersion
)
// Scala 2.13 only: "scafi-simulator-gui", "scafi-distributed"or via Gradle (build.gradle.kts):
dependencies {
implementation("it.unibo.scafi:scafi-core_3:1.8.0") // or scafi-core_2.13
}2. Write an aggregate program:
package experiments
import it.unibo.scafi.incarnations.BasicSimulationIncarnation.{AggregateProgram, StandardSensorNames}
class MyAggregateProgram extends AggregateProgram with StandardSensorNames {
override def main() = gradient(isSource)
def gradient(source: Boolean): Double =
rep(Double.PositiveInfinity){ distance =>
mux(source) { 0.0 } {
foldhoodPlus(Double.PositiveInfinity)(Math.min)(nbr{distance} + nbrRange)
}
}
def isSource = sense[Boolean]("source")
def nbrRange = nbrvar[Double](NBR_RANGE)
}3. Run it in the simulator GUI (scafi-simulator-gui, Scala 2.13):
import it.unibo.scafi.simulation.frontend.{Launcher, Settings}
object SimulationRunner extends Launcher {
Settings.Sim_ProgramClass = "experiments.MyAggregateProgram"
Settings.ShowConfigPanel = false
launch()
}More information is available in the ScaFi Documentation.
Related tools
- Alchemist Simulator: a rich, flexible simulation framework that supports ScaFi
- Protelis: an external Aggregate Programming DSL
People
Main Researchers and Authors
- Mirko Viroli
- Roberto Casadei
- Gianluca Aguzzi
Research Collaborators
- Danilo Pianini
- Giorgio Audrito
- Ferruccio Damiani
Cite ScaFi
R. Casadei, M. Viroli, G. Aguzzi, D. Pianini. ScaFi: A Scala DSL and Toolkit for Aggregate Programming. SoftwareX 20, 101248 (2022). doi:10.1016/j.softx.2022.101248
BibTeX
@article{casadei2022scafi,
author = {Roberto Casadei and Mirko Viroli and Gianluca Aguzzi and Danilo Pianini},
title = {ScaFi: A Scala DSL and Toolkit for Aggregate Programming},
journal = {SoftwareX},
volume = {20},
pages = {101248},
year = {2022},
doi = {10.1016/j.softx.2022.101248}
}
More papers that describe or use ScaFi are listed in Papers.
Contacts
- roby [dot] casadei [at] unibo.it
- mirko [dot] viroli [at] unibo.it