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

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.

People

Main Researchers and Authors

Research Collaborators

Cite ScaFi

If you use ScaFi in your research, please cite:
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