
import Timing
import Randomish
import System.Environment
import Data.Array.Parallel.Prelude	as P
import Data.Array.Parallel.PArray	as P
import qualified Data.Vector.Unboxed	as V
import qualified DotProductVector	as V
import qualified DotProductVectorised	as Z

main :: IO ()
main 
 = do	args	<- getArgs
	case args of
	  [alg, len] 	-> run alg (read len) 
	  _		-> usage

usage
 = putStr $ unlines
 	[ "usage: dotp <alg> <length>"
 	, "  alg one of " ++ show ["vectorised", "vector"] ]
	
run alg len
 = do	let vec1 = randomishDoubles len 0 1 1234
	let vec2 = randomishDoubles len 0 1 12345

	(result, tElapsed) <- runAlg alg vec1 vec2

	putStr	$ prettyTime tElapsed
	putStr	$ (take 12 $ show result) ++ "\n"

runAlg "vectorised" vec1 vec2 
 = do	let arr1 = fromUArrPA' vec1
	let arr2 = fromUArrPA' vec2
	arr1 `seq` arr2 `seq` return ()

	time	$ let result	= Z.dotPA arr1 arr2
		  in  result `seq` return result

runAlg "vector" vec1 vec2
 = do	vec1 `seq` vec2 `seq` return ()

	time	$ let result	= V.dotV vec1 vec2 
		  in  result `seq` return result
		
