From 93a9d883f2d448eb369edb0d1671af861fd33b0d Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Tue, 14 Oct 2025 17:32:40 +0200 Subject: [PATCH] scp1: report --- scala_project_2025/part1/report.md | 192 ++++++++++++++++++++++++++++ scala_project_2025/part1/report.pdf | Bin 0 -> 39384 bytes 2 files changed, 192 insertions(+) create mode 100644 scala_project_2025/part1/report.md create mode 100644 scala_project_2025/part1/report.pdf diff --git a/scala_project_2025/part1/report.md b/scala_project_2025/part1/report.md new file mode 100644 index 0000000..20d7fda --- /dev/null +++ b/scala_project_2025/part1/report.md @@ -0,0 +1,192 @@ +--- +date: 2025-10-14 +author: fredrik robertsen +title: scala project part 1 +--- + +## task 1 + +### a) + +to create a range from 1 through 50 explicitly with a for-loop, we can +initialize a mutable collection and update it. + +```scala +// immutable pointer +val values = new collection.mutable.ArrayBuffer[Int] + for (i <- 1 to 50) + values.append(i) +``` + +### b) + +we can sum numbers in an integer array `Array[Int]` by iterating over the +numbers and updating a mutable variable `result`. + +```scala +def iterative_sum(numbers: Array[Int]): Int = + var result = 0 + for (num <- numbers) + result += num + return result +``` + +note: the `return` keyword can be omitted, which will be done in later tasks. + +### c) + +as usual, we can use an auxiliary function to carry the accumulated value of the +recursion, thus yielding a tail-recursive sum. the compiler may or may not +optimize tail-recursive functions in scala. we can force it to do so using the +`@tailrec` annotation on our recursive auxiliary function `inner`. + +```scala +def recursive_sum(numbers: Array[Int]): Int = + @tailrec def inner(numbers: Array[Int], accumulator: Int): Int = + if numbers.length <= 0 then accumulator + else inner(numbers.tail, numbers.head + accumulator) + inner(numbers, 0) +``` + +### d) + +we can use the classic definition for fibonacci numbers to obtain a simple +recursive function. the main point here is that we make the base-case +a `BigInt`, such that subsequent arithmetic conforms to this type, thus +satisfying the specified return-type. + +```scala +def fibonacci(n: Int): BigInt = + if n <= 1 then BigInt(1) + else fibonacci(n - 1) + fibonacci(n - 2) +``` + +note: the aforementioned `return` statements have been omitted. + +## task 2 + +### a-b) + +i reimplemented my oz-functions in scala. the first function finds the roots of +a second degree polynomial optionally if there are any real solutions. the main +difference is how we communicate to the caller that there were no real +solutions. + +in oz we use the named return variable `RealSol` for the `proc`ess +`QuadraticEquation`. + +```oz +proc {QuadraticEquation A B C ?RealSol ?X1 ?X2} Discriminant in + Discriminant = B*B - 4.0*A*C + RealSol = Discriminant >= 0.0 + if RealSol then + X1 = (~B - {Sqrt Discriminant})/(2.0*A) + X2 = (~B + {Sqrt Discriminant})/(2.0*A) + end +end +``` + +in scala we use an `Option` that is either `Some(x)` or `None`. we encode the +two solutions as a tuple. note: if there is only one unique solution, both +values in the tuple will be equal. + +```scala +def quadratic(a: Double, b: Double, c: Double): Option[(Double, Double)] = + val disc = math.pow(b, 2) - 4 * a * c + if disc < 0 then None + else Some((-b - math.sqrt(disc)) / (2 * a), (-b + math.sqrt(disc)) / (2 * a)) +``` + +the last function encodes a polynomial as a sort of curried function that takes +in the coefficients and returns a function that evaluates the given polynomial +at that point. + +```oz +fun {Quadratic A B C} + fun {$ X} A*X*X + B*X + C end +end +``` + +```scala +def polynomial(a: Double, b: Double, c: Double): Double => Double = + (x: Double) => a * x * x + b * x + c +``` + +the solutions for anonymous function return values are vastly similar between +the languages. + +## task 3 + +### a) + +we can instantiate a `Thread` object and override its `run` method with our own +`execute` function. note: the input function `execute` is similar to a void +function in C and denotes some effectual action that likely modifies some state. +we must take care to avoid race conditions when initializing multiple such +threads. + +```scala +def initialize_thread(execute: () => Unit): Thread = + new Thread { override def run = execute() } +``` + +### b) + +the code runs endlessly and is supposed to have one value increment, while the +other decrements, as if moving one unit from one stack to another, maintaining +the same number of total such units. we start with 1000 units in one stack and +0 in the other. + +however, in the course of the program, the scheduler on my computer lets the +threads we create to perform this task of moving units run in a weird order, +thus ending up increasing the total amount of units we have available through +a race condition. + +this is a classic asynchronous programming pitfall which would be devastating +for applications like a bank, where the units would be money, and such +concurrent transactions would yield an unintentional net increase or decrease +in someone's balance. + +this could very much happen in oz as well. however, oz is made with concurrency +in mind, making it harder to make such a mistake. + +### c) + +the easiest (least-effort) way to modify the code such that it is correct and +thread-safe is to lock the critical section using scala's `synchronized` method + +```scala +def execute(): Unit = { + while (true) { + this.synchronized { // force serialization + moveOneUnit() + updateSum() + } + Thread.sleep(50) + } +} +``` + +another way to make it safe is to lock the internal values before updating them, +for example using atomic data types such as `AtomicInteger`s + +```scala +object ConcurrencyTroubles { + private var value1: AtomicInteger = new AtomicInteger(1000) + private var value2: AtomicInteger = new AtomicInteger(0) + private var sum: AtomicInteger = new AtomicInteger(0) + + def moveOneUnit(): Unit = { + value1.decrementAndGet() + value2.incrementAndGet() + value1.compareAndSet(0, 1000) + value2.compareAndSet(1000, 0) + } + + def updateSum(): Unit = { + sum.setRelease(value1.get() + value2.get()) + } + + ... +} +``` diff --git a/scala_project_2025/part1/report.pdf b/scala_project_2025/part1/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..66c2906d75371138095769209d1b9c8b8de16b61 GIT binary patch literal 39384 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�jS}RsYB%F7x z++$PsMqN_n&1M+=U)H@8!ca_Wly{I_fUvd#0KPP$g~dc!N3vZG}pcDwV_f+m`7 zzqYzOe6C&k`s0%Sxud3(yuvnQ37YB1Ps-wg3|T@3%0Y8ep!qDw5GrAX{raFiUT-k%L9{`R)Ax-k8=dHKYD7hWCZeS0PRUDC%5uhY`gPj8#W zw@y-i?&fpz79HOD>en`@J1fLyKV7!ceg3Y@RsAP-1)uvL^zLr;-5OOEzO6IbHroDp zkZoJ{<7ly1$dx5#*CtJ8Uwjz?`bV=S)xxj8w{_T|33 z9DScxx*yK@EXs-PZF*E*`a$pTv$us3cM~taiJm$sb-AC>)cR-o|K1yXb1#)^tqs5S zw$tY8wXdb0*PZiE`p=cOeBJK?$0e5vubP_uJJWw$$fcJ$uW3d*jFX6@i=H=EncM_tnt$xWHPg2ADvjR`A8sFwdU4o!AB+iAB*R5Scz=(KXPJy#OTYW*f=y{fiPee|MBS@}%+uEP1o8?twA(5`#*!RGA4 zhI!ZO8QQkjX<{jWjj=8nwX`s>1mzEGb4GS{T+n5w6?5)ZRXc=S{r5iV_ilOP>U)QI z4u6nvkP)1?y+PwthkwnaS&wdu^oCpsGB)j>VPC`Iv8-{0YUQb($ASHliBc;PmOe8K zu8K&T_h#Y5pRW~W@tyvCxB9@A+dIGitFGs%e!unGo4wb{Yv<2@U(UO*MLHksdC3o*aNU@D#?4b?!4fX3E8ap2TyZ>OF{TqAx^m|{9|7uy*cl_URFZ=%+ z)1Pr)|H0$5NIl6u=UwtoixZn@C<`MGX{#?GZrTS|^vdR+apJnhW;j|T-i zC(Oug@o-$yHYccGYZv2sicM2kgE%Y3j?=I4AN|x(q;TosBYD-$YpE#qtEy+4Sk~3XUUtFY%imE zd)c}f6PWLKBBI z_4Z$_Q?J!FN&nxx>>c;)dE(#p{QTJ=cYb#Imk!67&o>&``B(7j1}iOW=kzZ$bXl@3 zYn5Qw!l_41=j3}SJp1hXeD;L>-z2$wo%oQQ#&aW1x zS6%Kav;^L1N9jCSq|7rphVa9-sKf7ui9wi6k{CQqC0;W0tu=GUW% z0n#OBGN*MMT_UN*x1GnBm!D5U?1ufJJ2olv>%L5=opw>Uh;Pz?YWH3JpO;n7-s3Bl zEp=()yt<{9do?dkO7ryIY;oz4E%W1_6^d~^(;u0Byj5WtH~r!KhbK5r6r{1Fv81x3 zx1{XgTF{^`z;%Rar9}#&Pr@cQZi$-C93|0Qo!p!p2p zlMJ(WN{Y|wIK5}mjXN!;y`4X*N9O$V?9@DYqr=1OQU~AMSJ`Rj>)-usW*5F!Q}kVL zSNG~X*_eI*=I$@_e)sOi*NAti^W)Yy-OFwXFWAT8-w=3V#)4T9FARORuDO^Qc-&?4 z)eL7w^NP#TLYGCZnVBv(*O=qmy}YZZ@YcL5eV0|EMJg9-zDt;_u5VTR(?>LW$;Ct3 zZz3|YpKiWv_Ri+0ukO;lf$O;ndj&P}WjmFMZDUh9S=wGQ`v|S%o6xoPp=)BP;!)Y` zwW5q{QU|PiH?4Rteysc3z1V`gygLd~i&U08^xC{#a_ZTdSi#MvysGl=IXn4#`Mdf1 z-v@YVWvYg2hQBKN5pJc$tTlIP<1x<=!6~O!TzPV(%uTi2`=#gP2 zuDRC8SQW@4BhZxX?ek@oS&3`p)KdxblU9CNm6g7AhNX(drM^{csoC7&_W%F9I<$4| z{j$4OpP%%H`#%jka_ve%;rzHCn?C*t7vGWY_H2Xj8}V<#)^=qfosYOQSGrW5PSS`f zQSYBWts!QuJ>ONP4vnn40lK$}CVy9+Kj-2!5h=Mz`rDHZ?Kr<~-#@e8O>v7-&;Luk z{WJN)ZSEcCQcqb0E-Q;kulHAf#2=z}Xt1I@iRb7dE6P~?-gHi9sny=!XVH>X6 zXt-Q`%r-^(T>7!l_`sITynTI}j�#m^*3H;wgtZj`~bsoaFCQ)A#-ME?Z0YPxDvI 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 Ya49ZHEGhw)kH!`Tre<8Ks;>TS0GK=Gng9R* literal 0 HcmV?d00001