| layout | home |
|---|---|
| title | Home |
| order | 0 |
| main | true |
| excerpt | scafi (Scala with computational Fields) is a field calculus-based DSL and toolkit for Aggregate Programming, providing a support for globally describing and executing self-organising, collective adaptive systems made of a networked set of logical situated devices. |
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, which is made available as a usable domain-specific language (DSL), and provides a platform and API for simulating and executing Aggregate Computing systems and applications.
- ScaFi User Manual
- ScaFi Developer Manual
- https://github.com/scafi/hello-scafi : shows basic usage of ScaFi
- https://github.com/scafi/learning-scafi-alchemist : shows how to use ScaFi within the Alchemist simulator in order to simulate aggregate systems
- A tutorial repository on ScaFi and aggregate computing by G. Audrito
- A tutorial on ScaFi delivered at the ACSOS'23 conference
Notes
- ScaFi >= 0.3.3 cross-compiles for Scala 2.11, 2.12, 2.13.
- Add the dependency to scafi in your project, e.g., via sbt (
build.sbt):
{% highlight scala %}
val scafiVersion = "{{ site.scafi }}" val scafi_core = "it.unibo.scafi" %% "scafi-core" % scafiVersion val scafi_simulator = "it.unibo.scafi" %% "scafi-simulator" % scafiVersion val scafi_simulator_gui = "it.unibo.scafi" %% "scafi-simulator-gui" % scafiVersion val scafi_platform = "it.unibo.scafi" %% "scafi-distributed" % scafiVersion
libraryDependencies ++= Seq(scafi_core, scafi_simulator_gui, scafi_platform) {% endhighlight %}
or via Gradle (build.gradle.kts):
{% highlight kotlin %} plugins { java scala }
dependencies { val scalaMajor = "2.12" val scafiVersion = "{{ site.scafi }}" implementation("org.scala-lang:scala-library:2.12.14") implementation("it.unibo.scafi:scafi-core_$scalaMajor:$scafiVersion") implementation("it.unibo.scafi:scafi-simulator-gui_$scalaMajor:$scafiVersion") } {% endhighlight %}
- Use the API (e.g., to set up a simple simulation)
{% highlight scala %} package experiments
import it.unibo.scafi.incarnations.BasicSimulationIncarnation.AggregateProgram
class MyAggregateProgram extends AggregateProgram {
override def main() = gradient(isSource)
def gradient(source: Boolean): Double = rep(Double.PositiveInfinity){ distance => mux(source) { 0.0 } { foldhood(Double.PositiveInfinity)(Math.min)(nbr{distance}+nbrRange) } }
def isSource = senseBoolean def nbrRange = nbrvarDouble }
import it.unibo.scafi.simulation.frontend.{Launcher, Settings}
object SimulationRunner extends Launcher { Settings.Sim_ProgramClass = "experiments.MyAggregateProgram" Settings.ShowConfigPanel = false launch() }
{% endhighlight %}
More information is available in the ScaFi Documentation.
- Alchemist Simulator: a rich, flexible simulation framework that supports ScaFi
- Protelis: an external Aggregate Programming DSL
- Mirko Viroli
- Roberto Casadei
- Gianluca Aguzzi
- Danilo Pianini
- Giorgio Audrito
- Ferruccio Damiani
- See papers
- roby [dot] casadei [at] unibo.it
- mirko [dot] viroli [at] unibo.it