Added assignment sources
This commit is contained in:
commit
63f27e6a93
9 changed files with 226 additions and 0 deletions
BIN
Assignment04-model_checking.pdf
Normal file
BIN
Assignment04-model_checking.pdf
Normal file
Binary file not shown.
2
Reversal/.gitignore
vendored
Normal file
2
Reversal/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
.idea
|
||||||
|
target
|
7
Reversal/README.md
Normal file
7
Reversal/README.md
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Array reverser Java sources
|
||||||
|
|
||||||
|
To compile and execute the reverser run:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mvn clean compile exec:java
|
||||||
|
```
|
27
Reversal/pom.xml
Normal file
27
Reversal/pom.xml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>ch.usi.inf.si</groupId>
|
||||||
|
<artifactId>reverse</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>1.2.1</version>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>ReverserTest</mainClass>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
19
Reversal/src/main/java/ArrayReverser.java
Normal file
19
Reversal/src/main/java/ArrayReverser.java
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
abstract class ArrayReverser implements Reverser
|
||||||
|
{
|
||||||
|
volatile int[] array;
|
||||||
|
volatile int[] reversed;
|
||||||
|
|
||||||
|
public void setArray(int[] array) {
|
||||||
|
this.array = array;
|
||||||
|
this.reversed = new int[array.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] array() {
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int[] reversed() {
|
||||||
|
return reversed;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
64
Reversal/src/main/java/ParallelReverser.java
Normal file
64
Reversal/src/main/java/ParallelReverser.java
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
class ParallelReverser extends ArrayReverser
|
||||||
|
{
|
||||||
|
|
||||||
|
// number of threads
|
||||||
|
private final int N;
|
||||||
|
// number of elements mapped by each thread
|
||||||
|
private final int S;
|
||||||
|
|
||||||
|
// reverse `array` using N threads
|
||||||
|
public ParallelReverser(int[] array, int N) {
|
||||||
|
setArray(array);
|
||||||
|
this.N = N;
|
||||||
|
this.S = array.length / this.N;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reverse() {
|
||||||
|
ArrayList<Thread> threads = new ArrayList<>();
|
||||||
|
for (int n = 0; n < N; n++) {
|
||||||
|
// thread t will reverse a[n*S..n*S + S]
|
||||||
|
int from = n*S;
|
||||||
|
int to = (n*S + S);
|
||||||
|
// the last thread takes what's left
|
||||||
|
if (n == N - 1)
|
||||||
|
to = array.length;
|
||||||
|
ThreadedReverser s = new ThreadedReverser(array, from, to, reversed);
|
||||||
|
Thread t = new Thread(s);
|
||||||
|
threads.add(t);
|
||||||
|
// start the thread
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
// wait for all threads to terminate
|
||||||
|
for (int k = 0; k < threads.size(); k++) {
|
||||||
|
try {
|
||||||
|
Thread t = threads.get(k);
|
||||||
|
// wait for thread t to terminate
|
||||||
|
t.join();
|
||||||
|
} catch (InterruptedException s) {
|
||||||
|
System.out.println("Thread interrupted");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ThreadedReverser extends SequentialReverser implements Runnable
|
||||||
|
{
|
||||||
|
private int from, to;
|
||||||
|
|
||||||
|
ThreadedReverser(int[] array, int from, int to, int[] result) {
|
||||||
|
super(array);
|
||||||
|
// reverse `array` into the given `result` array
|
||||||
|
this.reversed = result;
|
||||||
|
this.from = from;
|
||||||
|
this.to = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
reverse(from, to);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
17
Reversal/src/main/java/Reverser.java
Normal file
17
Reversal/src/main/java/Reverser.java
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
interface Reverser
|
||||||
|
{
|
||||||
|
|
||||||
|
// reverse current array
|
||||||
|
void reverse();
|
||||||
|
|
||||||
|
// set array to be reversed and resets reversed array
|
||||||
|
void setArray(int[] array);
|
||||||
|
|
||||||
|
// get current, unreversed array
|
||||||
|
int[] array();
|
||||||
|
|
||||||
|
// get the results after calling reverse()
|
||||||
|
int[] reversed();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
70
Reversal/src/main/java/ReverserTest.java
Normal file
70
Reversal/src/main/java/ReverserTest.java
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
class ReverserTest
|
||||||
|
{
|
||||||
|
|
||||||
|
private int[] testSequential(int[] a) {
|
||||||
|
SequentialReverser rev = new SequentialReverser(a);
|
||||||
|
rev.reverse();
|
||||||
|
boolean ok = true;
|
||||||
|
for (int k = 0; k < a.length; k++)
|
||||||
|
ok = ok && (a[k] == rev.reversed()[a.length - k - 1]);
|
||||||
|
if (!ok)
|
||||||
|
System.out.println("Reversal error: " + Arrays.toString(a) + " reversed: " + Arrays.toString(rev.reversed()));
|
||||||
|
return rev.reversed();
|
||||||
|
}
|
||||||
|
|
||||||
|
private int[] testParallel(int[] a, int N) {
|
||||||
|
ParallelReverser rev = new ParallelReverser(a, N);
|
||||||
|
rev.reverse();
|
||||||
|
return rev.reversed();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean check(int[] a, int N) {
|
||||||
|
int[] s = testSequential(a);
|
||||||
|
int[] p = testParallel(a, N);
|
||||||
|
boolean result = Arrays.equals(s, p);
|
||||||
|
if (result)
|
||||||
|
System.out.println("Test successful");
|
||||||
|
else
|
||||||
|
System.out.println("Sequential reversal: " + Arrays.toString(s) + " but parallel reversal: " + Arrays.toString(p));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test1() {
|
||||||
|
int[] a = {1, 2, 3, 4, 5, 6};
|
||||||
|
check(a, 1);
|
||||||
|
check(a, 2);
|
||||||
|
check(a, 3);
|
||||||
|
check(a, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test2() {
|
||||||
|
int[] a = {-1, 2, -3, 4, -5, 6, -7};
|
||||||
|
check(a, 3);
|
||||||
|
check(a, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test3() {
|
||||||
|
int[] a = { };
|
||||||
|
check(a, 1);
|
||||||
|
check(a, 2);
|
||||||
|
check(a, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test4() {
|
||||||
|
int[] a = { 1 };
|
||||||
|
check(a, 1);
|
||||||
|
check(a, 2);
|
||||||
|
check(a, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
ReverserTest o = new ReverserTest();
|
||||||
|
o.test1();
|
||||||
|
o.test2();
|
||||||
|
o.test3();
|
||||||
|
o.test4();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
20
Reversal/src/main/java/SequentialReverser.java
Normal file
20
Reversal/src/main/java/SequentialReverser.java
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
class SequentialReverser extends ArrayReverser
|
||||||
|
{
|
||||||
|
|
||||||
|
public SequentialReverser(int[] array) {
|
||||||
|
setArray(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reverse() {
|
||||||
|
// reverse all elements of `array`
|
||||||
|
reverse(0, array.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reverse elements of `array` from index `from` (included) to
|
||||||
|
// index `to` (excluded) into array `reversed`
|
||||||
|
void reverse(int from, int to) {
|
||||||
|
for (int k = from; k < to; k++)
|
||||||
|
reversed[reversed.length - k - 1] = array[k];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in a new issue