Add initial fb_arc_set modules

This commit is contained in:
Ivaylo Ivanov 2018-12-24 17:52:14 +02:00
parent 16aeaf6c37
commit f76a31ce68
5 changed files with 68 additions and 3 deletions

View File

@ -1,8 +1,9 @@
This project contains some basic UNIX command line tools I had to do for TU.
Currently the toolset is ther following:
* mygrep - a simplified version of grep
* http - an implementation of HTTP 1.1 client and server
* cpair - a program that searches for the closest pair of points in a set of 2D-points
* (mygrep)[mygrep] - a simplified version of grep
* (http)[http] - an implementation of HTTP 1.1 client and server
* (cpair)[cpair] - a program that searches for the closest pair of points in a set of 2D-points
* (fb_arc_set)[fb_arc_set] - a set of programs that removes cycles in a directed graph
Feel free to read the descriptions for each tool.

30
fb_arc_set/Makefile Normal file
View File

@ -0,0 +1,30 @@
CC = gcc
CFLAGS = -std=c99 -pedantic -Wall -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_POSIX_C_SOURCE=200809L -g -c
TARGET_1 = generator
TARGET_2 = supervisor
all: $(TARGET_1).c $(TARGET_2).c
$(CC) $(CFLAGS) $(TARGET_1).c $(TARGET_2).c
$(CC) $(TARGET_1).o -o $(TARGET_1)
$(CC) $(TARGET_2).o -o $(TARGET_2)
generator: $(TARGET_1).c
$(CC) $(CFLAGS) $(TARGET_1).c
$(CC) $(TARGET_1).o -o $(TARGET_1)
supervisor: $(TARGET_2).c
$(CC) $(CFLAGS) $(TARGET_2).c
$(CC) $(TARGET_2).o -o $(TARGET_2)
install:
cp $(TARGET_1) /usr/local/bin/graph-$(TARGET_1)
cp $(TARGET_2) /usr/local/bin/graph-$(TARGET_2)
clean:
$(RM) $(TARGET_1)
$(RM) $(TARGET_2)
$(RM) *.o
$(RM) *.tgz
package:
tar -cvzf fb_arc_set.tgz $(TARGET_1).c $(TARGET_2).c Makefile

34
fb_arc_set/README.md Normal file
View File

@ -0,0 +1,34 @@
# fb_arc_set
The aim of these 2 modules is to implement an algorithm which removes cycles in a directed graph by removing the least edges possible.
A set of edges which must be removed to make a graph acyclic is also called a feedback arc set; and the
set with the least edges is a minimal feedback arc set.
## Algorithm
A simple randomized algorithm for this problem generates a feedback arc set by executing following steps:
* Order the vertices of the graph randomly, i.e. generate a random permutation of the set of vertices.
* Select all edges ( u, v ) for which u > v in the ordering. These edges form a feedback arc set.
## generator
The generator program takes a graph as input. The program repeatedly generates a random solution
to the problem as described above and writes its result to a circular buffer. It repeats this procedure until it is notified by the supervisor to terminate.
SYNOPSIS
generator EDGE1...
EXAMPLE
generator 0-1 1-2 1-3 1-4 2-4 3-6 4-3 4-5 6-0
## supervisor
The supervisor sets up the shared memory and the semaphores and initializes the circular buffer required
for the communication with the generators. It then waits for the generators to write solutions to the
circular buffer.
The supervisor program takes no arguments.
Once initialization is complete, the supervisor reads the solutions from the circular buffer and remem-
bers the best solution so far, i.e. the solution with the least edges. Every time a better solution than the previous best solution is found, the supervisor writes the new solution to standard output. If a generator writes a solution with 0 edges to the circular buffer, then the graph is acyclic and the supervisor terminates. Otherwise the supervisor keeps reading results from the circular buffer until it receives a `SIGINT` or a `SIGTERM` signal.
Before terminating, the supervisor notifies all generators that they should terminate as well. This can
be done by setting a variable in the shared memory, which is checked by the generator processes before
writing to the buffer. The supervisor then unlinks all shared resources and exits
**Note: The description is from the task I got from TU.**

0
fb_arc_set/generator.c Normal file
View File

0
fb_arc_set/supervisor.c Normal file
View File