1#!/usr/bin/env python
2# Testing the new parallel scanner class
3
4import os
5
6backupdir = os.getcwd()
7
8import numpy as np
9import pysces
10
11tbox = pysces.PyscesUtils.TimerBox()
12import time
13
14m = pysces.model('isola2a')
15
16ser = pysces.Scanner(m)
17
18print("Serial execution...")
19print("Start: ", tbox.normal_timer('SER'))
20print(next(tbox.SER))
21t1 = time.time()
22ser.quietRun = True
23ser.addScanParameter('V4', 60, 100, 11)
24ser.addScanParameter('V1', 100, 160, 16)
25ser.addScanParameter('V2', 100, 130, 16, follower=True)
26ser.addScanParameter('V3', 80, 90, 6)
27ser.addUserOutput('J_R1', 'A', 'ecR4_X', 'ccJR1_R1')
28# ser.addUserOutput('J_R1', 'A')
29ser.Run()
30print("Done: ", next(tbox.SER))
31t2 = time.time()
32print("Duration: %.2f seconds" % (t2 - t1))
33ser.statespersecond = len(ser.ScanSpace) / (t2 - t1)
34print("States per second: %.1f" % ser.statespersecond)
35
36print("\n\nParallel execution...scans per run =", 100)
37par = pysces.ParScanner(m, engine='multiproc')
38par.scans_per_run = 100
39t3 = time.time()
40par.addScanParameter('V4', 60, 100, 11)
41par.addScanParameter('V1', 100, 160, 16)
42par.addScanParameter('V2', 100, 130, 16, follower=True)
43par.addScanParameter('V3', 80, 90, 6)
44par.addUserOutput('J_R1', 'A', 'ecR4_X', 'ccJR1_R1')
45# par.addUserOutput('J_R1', 'A')
46par.Run()
47t4 = time.time()
48print("Duration: %.2f seconds" % (t4 - t3))
49par.statespersecond = par.Tsteps / (t4 - t3)
50print("States per second: %.1f" % par.statespersecond)
51
52print(
53    "\n Speedup with load balanced TaskClient: %.2f"
54    % (par.statespersecond / ser.statespersecond)
55)
56
57print("\n\nParallel execution...using RunScatter")
58par2 = pysces.ParScanner(m, engine='ipcluster')
59t5 = time.time()
60par2.addScanParameter('V4', 60, 100, 11)
61par2.addScanParameter('V1', 100, 160, 16)
62par2.addScanParameter('V2', 100, 130, 16, follower=True)
63par2.addScanParameter('V3', 80, 90, 6)
64par2.addUserOutput('J_R1', 'A', 'ecR4_X', 'ccJR1_R1')
65# par2.addUserOutput('J_R1', 'A')
66par2.RunScatter()
67t6 = time.time()
68print("Duration: %.2f seconds" % (t6 - t5))
69par2.statespersecond = par2.Tsteps / (t6 - t5)
70print("States per second: %.1f" % par2.statespersecond)
71
72print("\n Speedup with RunScatter: %.2f" % (par2.statespersecond / ser.statespersecond))
73
74print("\n===========\nComparing results...")
75# comp = np.equal(ser.SteadyStateResults, par.SteadyStateResults[::5])
76# print np.alltrue(comp)
77# comp2 = np.equal(ser.UserOutputResults, par.UserOutputResults[::5])
78# print np.alltrue(comp)
79
80sss = ser.SteadyStateResults
81pss = par.SteadyStateResults
82suo = ser.UserOutputResults
83puo = par.UserOutputResults
84p2ss = par2.SteadyStateResults
85p2uo = par2.UserOutputResults
86
87print("serial vs. parallel s/s results     : ", np.alltrue(np.equal(sss, pss)))
88print("serial vs. parallel user output     : ", np.alltrue(np.equal(suo, puo)))
89print("TaskClient vs RunScatter s/s results: ", np.alltrue(np.equal(pss, p2ss)))
90print("TaskClient vs RunScatter user output: ", np.alltrue(np.equal(puo, p2uo)))
91
92
93os.chdir(backupdir)
94