Complex systems science is a rather new discipline that has recently gained particular attention in several domains such as economy, biology, computer science, physics, and chemistry. To quote Stephen Hawking, “Complexity is the science of the 21st century” [5]. The idea of complex systems is captured precisely by Aristotle's *Metaphysics*, in which he remarkably describes “the whole [as] more than the sum of its parts” [11]. In fact, the collective behavior of a complex system cannot be inferred by merely looking at the behavior of the simple parts. What is interesting is looking at the interactions and relationships between the parts that give rise to the collective behavior.

The concept of complexity is connected to the notion of *edge of chaos* [6], a region in the state space of a system between complete order (i.e., periodic or no change) and total randomness or chaos (i.e., aperiodic change) where the complexity is maximal. Besides the more philosophical aspects, complex systems can be analyzed and simulated with the help of unconventional models (e.g., cellular automata, networks, agent-based models). Such models are, in general, fairly simple, but their mathematical/computational analysis and implementation may represent a challenge for students and for researchers outside mathematical and computational studies. Instructors may also be challenged by teaching complex systems modeling and analysis to a broad audience of students from different backgrounds, not necessarily familiar with the terminology and simulation techniques. With that in mind, Sayama has been actively involved in a multitude of summer and winter schools, seminars, conference tutorials, and academic courses within complex systems.

One of the main challenges that Sayama and colleagues (myself included) face when teaching complex systems science to students from diverse disciplines is the lack of simple, easily accessible basic teaching material that could be used for this purpose. On the other hand, several somewhat advanced research-oriented books exist [2, 14, 3] that tackle complexity from a more rigorous theoretical and mathematical perspective. The novelty of the book reviewed here, *Introduction to the Modeling and Analysis of Complex Systems*, lies in its ability to introduce the broad discipline of complex systems to beginners in the field, both students and instructors. This is done in a simple and clear way without ignoring technical aspects and with easily reproducible examples even for those not necessarily familiar with computer programming and scripting/coding abilities. Sayama's book is suitable for advanced high school, undergraduate, and graduate students in the natural sciences, the social sciences, technology and engineering, management, and economics, among others. The book is available under the OpenSUNY initiative [10] and is downloadable for free in PDF format. The book provides Python source code for all the given examples, together with solutions to the presented exercises. It uses a freely available Python-based simulation framework for complex systems modeling, called PyCX [12]. Sayama was also involved in the development of the PyCX example library.

The book is divided into three main parts: an introduction that covers brief historical notes, the key concepts of emergence and self-organization (recurring themes underlying all the subsequent chapters), and the basics of creating models; a second part that introduces key concepts such as phase space, bifurcation, and chaos together with modeling and analysis of discrete and continuous systems with a small number of variables; and a third part that deals with systems with a large number of variables. This last part covers cellular automata, continuous field models, dynamical networks, and agent-based models. In the remainder of this review, I will provide a summary of each part together with my personal interpretation and critical remarks. I will conclude with an overview of strengths and weaknesses of the book, particularly in relation to the field of artificial life.

“Part I: Preliminaries” begins with a basic definition of complex systems followed by examples of what complex systems are and what complex systems are not. It is quickly made clear that in order to fill the gap between systems where the components are completely independent and those that are completely coupled, the key concepts of emergence and self-organization have to be considered. Subsequently, Sayama presents his own list of seven topical clusters that represent his own view of the field of complex systems, ranging from nonlinear dynamics to game theory, from pattern formation to networks. This list is not the only categorization within the field; other conceptual maps exist in the literature, such as in [2].

As specified in the title of the book, one of the main topics is the modeling of complex systems. Chapter 2 outlines basic important concepts related to modeling (remember, the target audience of the book is students). In particular, the book explains why models are needed and how can they be created, either descriptively or by rule-based approaches. Of particular interest is the last section, which gives a historical perspective of how the two modeling methodologies have developed since the ancient times when pictures, diagrams, or texts were used. More recently, rule-based models began to be extensively used within complex systems, due largely to the work of von Neumann [15] and Ulam [13] on cellular automata. Again, the historical overview does not aim at being a rigorous study on the history of modeling. Rather, it is an intriguing and stimulating introduction that provides the reader with a perspective on the development of tools and methods that allowed complexity studies to originate in the first place. In general, I would argue that this first part is an interesting read both for the beginner, who will be left with the desire to know more, and for the more experienced reader, who will enjoy the characterization of the domain and the historical excursus while trying to match it with its own perspective. The goal of this first part is to introduce basic concepts and definitions to those new to the field of complex systems.

While writing such basic concepts does not pose any particular challenge, doing so in clear, basic language without making it seem monotonous and repetitive is no small feat. Sayama clearly succeeded in doing that. One minor criticism is the choice of not including other basic concepts such as phase space, bifurcation, and chaos (which are moved to the following parts), and concepts such as feedback loops, positive feedback, and negative feedback (which are unfortunately not clarified in the book).

“Part II: Systems with a Small Number of Variables” deals with dynamical systems—systems that change over time (either discretely or continuously)—with a small number of variables. It is clear from the beginning of this section that the main concern of the author is making the readers, presumably students, learn concepts, relate, and think, and not merely memorize definitions. This is achieved by a series of small exercises, which are well integrated with the text throughout the whole book. Chapters 4 and 5 deal with modeling of discrete-time systems and their analysis, respectively. Note that this structure, one chapter on modeling and one chapter on analysis, is consistent throughout the book for all the other modeling schemes. Another interesting feature that appears from Chapter 4 is the coding examples, which are also collected on the author's book online repository. Thus, it is possible to execute the code while reading, compare examples, tweak them, and rerun. Sometimes readers may feel as if they are going through a tutorial, which is often helpful when getting hands-on experience.

Chapters 6 and 7 deal with continuous-time models and analysis. Of particular interest is the analysis of the behavior of dynamical systems around their states of equilibrium, where very small perturbations (i.e., slight changes in parameter values) can produce drastic changes in the system's behavior or bifurcations (Chapter 8), which can lead to chaos (Chapter 9). Though this part may resemble a technical tutorial, Sayama gives interesting pointers and digressions on real-world systems of particular interest in the artificial life community such as neurons, pattern formation, morphogenesis, and ecosystems. Opting for a simple language and ground-to-ground examples, such as “the butterfly effect […] a flap of a butterfly's wings in Brazil could set off a tornado in Texas,” [p. 154] is both a choice of the author and a necessity.

“Part III: Systems with a Large Number of Variables,” the largest part in the book, begins with a chapter (Chapter 10) on interactive simulation of real-world sized complex systems. For this purpose, the interactive simulator PyCX is introduced. The way all examples (and related code) are structured reflects intuitively what one would expect from a complex systems simulation. In fact, the structural framework is always broken down into three main components: initialization, observation, and updates. This clearly reflects the idea that some initial conditions have to be identified (initialization), the system’s behavior has to be observed at some scale (observation), and the components of the system have to interact locally to dynamically change their states (updates). The PyCX libraries provided with the book allow for graphical visualization and parameter control. The next two chapters, 11 and 12, deal with cellular automata. In the first few pages, a formal definition and general terminology are given, with examples of well-known rules such as the majority rule, the parity rule, and Conway's *Game of Life* [4], which give rise to complex emergent computations and behaviors. Once again, readily available code is presented for simulation and modeling of simple and more complex cellular automata models, with intuitive explanation of phase transitions of macroscopic properties. Other interesting models are also presented, such as the Turing pattern formation model, the host-pathogen model, and the epidemic–forest fire model. All the presented example models may serve as useful starting points for any course project work.

Chapters 13 and 14 provide a solid introduction to continuous field models represented by partial differential equations. The rigorous definition in the first part of the chapter is followed by intuitive examples of reaction-diffusion systems such as the Belousov-Zhabotinsky reaction. Again, the chapter contains many interesting and useful examples that students can use as a baseline for further extensions. The next four chapters—Chapters 15 through 18—are devoted to networks. Though that block seems long, the material to be covered is rather broad (a whole book would not be enough for completeness). Sayama introduces the terminology of graph theory with simple words first, followed by a comprehensive chapter of network models, ranging from “dynamics on networks” to “dynamics of networks” and models of “adaptive networks.” A wide set of practical examples is documented with basic code for hands-on experimentation. Two separate chapters analyze different network topologies and their characteristics as well as dynamical properties of networks. Given the multitude of network types and application in different research disciplines and industries, this block of chapters may be considered one of the main blocks of the book and could potentially be used for a specific course or module for an introduction to the modeling and analysis of network topologies and dynamics. Several nice introductory books [1, 8, 7] and articles [9] on the topic exist, but none have the same level of examples and emphasis on teaching the practical aspects.

The last chapter of the book, Chapter 19, introduces another essential aspect of complex systems modeling, namely, agent-based models. Useful examples such as garbage collection by ants and predator-prey models are presented. Sadly, this chapter is rather short and does not offer a detailed analysis as was done for the previous topics in the book. Important evolutionary aspects such as inheritance, variation, and selection are touched on only briefly. The reader may leave with the impression that this last chapter is unfinished.

In conclusion, Sayama's book is a very good instrument for students who want to read an introductory text on modeling and analysis of complex systems, and for instructors who need such a text in simple language for their complex systems courses and projects. The book offers a good introduction to the complex systems terminology and plenty of readily available examples with technical implementation details. Although all the relevant topics are present in the book, some are extensively discussed while others could have been expanded (e.g., agent-based models). Overall, *Introduction to the Modeling and Analysis of Complex Systems* offers a novel pedagogical approach to the teaching of complex systems, based on examples and library code that engage students in a tutorial-style learning adventure. It is a solid tool that may become one of the primary instruments for teaching complex systems science and help the discipline to become more established in the academic world, triggering the necessary transition from a top-down tradition to a bottom-up complex systems approach. Only if we are able to allow this paradigm shift will we be able to prepare the next generation of researchers to tackle the challenges within the field of artificial life.

## Acknowledgments

My thanks to Dragana Laketic, Gunnar Tufte, and Ann-Marie Thoresen for comments on a previous draft.

## References

## Author notes

Department of Computer and Information Science, Norwegian University of Science and Technology, Sem Sælands vei 9, 7491 Trondheim, Norway. E-mail: nichele@idi.ntnu.no