annotate sim.py @ 14:ac2ff6be22f7

Take circuit name in top level function. Print command which failed if it does.
author Daniel O'Connor <darius@dons.net.au>
date Sun, 19 Nov 2023 00:05:58 +1030
parents 49939e179c86
children f0665f53b854
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
1 import datetime
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
2 import pathlib
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
3 from scipy.optimize import differential_evolution
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
4 from spicelib.simulators.ltspice_simulator import LTspice
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
5 from spicelib.log.ltsteps import LTSpiceLogReader
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
6 from spicelib.editor.spice_editor import SpiceEditor
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
7 #from spicelib.sim.sim_runner import SimRunner
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
8 import shlex
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
9 import sqlite3
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
10 import subprocess
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
11
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
12 def simulate(src, simexe, simflags, rundir, runname, params):
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
13 src = pathlib.Path(src)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
14 runname = pathlib.Path(runname)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
15 assert(runname.suffix == '.net')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
16 rundir = pathlib.Path(rundir)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
17
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
18 e = SpiceEditor(src)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
19 for k in params:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
20 e.set_parameter(k, params[k])
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
21
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
22 #s = SimRunner(simulator = LTspice, output_folder = 'tmp', verbose = True)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
23 #s.simulator.spice_exe = [simexe]
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
24 #raw_file, log_file = s.run_now(e, run_filename = runname)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
25
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
26 e.write_netlist(rundir / runname)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
27
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
28 cmd = [simexe, '-b']
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
29 cmd.extend(simflags)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
30 cmd.append(runname.name)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
31 then = datetime.datetime.now()
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
32 print(f'Starting run {runname} at {then}')
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
33 p = subprocess.Popen(cmd, cwd = rundir)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
34 p.communicate()
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
35 now = datetime.datetime.now()
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
36 taken = now - then
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
37
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
38 if p.returncode != 0:
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
39 print('Run failed: ' + ' '.join(map(shlex.quote, cmd)))
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
40 return 100000
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
41
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
42 #rawpath = rundir / runname.with_suffix('.raw')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
43 #raw = spicelib.RawRead(rawpath)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
44 logpath = rundir / runname.with_suffix('.log')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
45 log = LTSpiceLogReader(logpath)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
46
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
47 power = log.get_measure_value('pout')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
48 eff = log.get_measure_value('efficiency')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
49 thd = log.fourier['V(rfout)'][0].thd
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
50 ipeak_u2 = log.get_measure_value('ipeak_u2')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
51 ipeak_u5 = log.get_measure_value('ipeak_u5')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
52 ipeak = max(ipeak_u2, ipeak_u5)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
53
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
54 return then, taken, power, eff, thd, ipeak
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
55
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
56 def calccost(power, eff, thd, ipeak):
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
57 # Calculate the cost
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
58 tpwr = 1500
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
59 tthd = 2
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
60 teff = 90
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
61 imax = 11
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
62
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
63 cost = 0
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
64 if power < tpwr * 0.80:
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
65 cost += 100
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
66 elif power < tpwr:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
67 cost += (tpwr - power) / tpwr / 100
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
68
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
69 if thd > 5 * tthd:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
70 cost += 100
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
71 else:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
72 thdinv = 100 - thd
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
73 tthdinv = 100 - tthd
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
74 if thdinv < tthdinv:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
75 cost += (tthdinv - thdinv) / tthdinv
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
76 if eff < teff:
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
77 cost += (teff - eff) / teff
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
78
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
79 if ipeak > imax:
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
80 cost += (ipeak - imax) * 5
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
81
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
82 return cost
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
83
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
84 def fn(v, dsn, simexe, simflags, rundir, circ):
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
85 '''Called by differential_evolution, v contains the evolved parameters, the rest are passed in from the args parameter'.
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
86 Returns the cost value which is being minimised'''
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
87
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
88 # Get parameters for run
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
89 duty, c1, c2, l1, l2 = v
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
90
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
91 # Check if this combination has already been tried
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
92 dbh = sqlite3.connect(dsn)
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
93 cur = dbh.cursor()
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
94 cur.execute('SELECT run, power, efficiency, thd, ipeak FROM GAN190 WHERE name = ? AND duty = ? AND c1 = ? AND c2 = ? AND l1 = ? AND l2 = ?',
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
95 (circ, duty, c1, c2, l1, l2))
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
96 tmp = cur.fetchone()
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
97 if tmp is not None:
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
98 run, power, eff, thd, ipeak = tmp
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
99 # Recalculate the cost since it is cheap and might have been tweaked since the original run
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
100 cost = calccost(power, eff, thd, ipeak)
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
101 print(f'Found run {run:3d}: Duty {duty:3.0f}%, C1 {c1:3.0f}pF, C2 {c2:3.0f}pF, L1 {l1:3.0f}uH, L2 {l2:4.0f}nH -> Power: {power:6.1f}W Efficiency: {eff:5.1f}% THD: {thd:5.1f}% IPeak: {ipeak:4.1f}A Cost: {cost:6.2f}')
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
102 return cost
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
103
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
104 # Get next run number
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
105 cur.execute('BEGIN DEFERRED')
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
106 cur.execute('INSERT INTO GAN190 DEFAULT VALUES RETURNING rowid')
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
107 run = cur.fetchone()[0]
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
108 cur.execute('COMMIT')
11
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
109
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
110 # Run the simulation
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
111 # Need to convert units to suit
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
112 runname = pathlib.Path(circ).stem + '-' + str(run) + '.net'
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
113 then, taken, power, eff, thd, ipeak = simulate(circ, simexe, simflags, rundir, runname,
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
114 {'dutypct' : duty, 'C1' : c1 * 1e-12, 'C2' : c2 * 1e-12, 'L1' : l1 * 1e-6, 'L2' : l2 * 1e-9})
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
115 # Calculate the cost
8d34a9eec184 Split out cost function so we can re-run it on DB data to allow faster adjustment.
Daniel O'Connor <darius@dons.net.au>
parents: 10
diff changeset
116 cost = calccost(power, eff, thd, ipeak)
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
117
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
118 # Log & save the results
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
119 print(f'Run {run:3d}: Duty {duty:3.0f}%, C1 {c1:3.0f}pF, C2 {c2:3.0f}pF, L1 {l1:3.0f}uH, L2 {l2:4.0f}nH -> Power: {power:6.1f}W Efficiency: {eff:5.1f}% THD: {thd:5.1f}% IPeak: {ipeak:4.1f}A Cost: {cost:6.2f}')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
120 taken = taken.seconds + taken.microseconds / 1e6
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
121 cur.execute('BEGIN DEFERRED')
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
122 cur.execute('REPLACE INTO GAN190 (name, run, start, duration, duty, c1, c2, l1, l2, power, efficiency, thd, ipeak, cost) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
123 (circ, run, then, taken, duty, c1, c2, l1, l2, power, eff, thd, ipeak, cost))
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
124 cur.execute('COMMIT')
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
125
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
126 return cost
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
127
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
128 def ev(circ):
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
129 # Bounds for parameters
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
130 # Note that the parameters are also constrained to be integral
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
131 bounds = [(10, 80),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
132 (1, 20),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
133 (10, 300),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
134 (1, 20),
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
135 (10, 500)]
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
136
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
137 # Initial solution
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
138 x0 = [36, 10, 155, 5, 140]
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
139
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
140 # Where to save results
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
141 dsn = 'results.db'
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
142 dbh = sqlite3.connect(dsn)
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
143 cur = dbh.cursor()
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
144 cur.execute('''
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
145 CREATE TABLE IF NOT EXISTS GAN190 (
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
146 name TEXT, -- Circuit name
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
147 run INTEGER, -- Run number
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
148 start DATETIME, -- Datetime run started
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
149 duration REAL, -- Length of run (seconds)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
150 duty REAL, -- Duty cyle (%)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
151 c1 REAL, -- Value of C1 (pF)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
152 c2 REAL, -- Value of C2 (pF)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
153 l1 REAL, -- Value of L1 (uH)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
154 l2 REAL, -- Value of L2 (nH)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
155 power REAL, -- Measured power (Watts)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
156 efficiency REAL, -- Measured efficiency (%)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
157 thd REAL, -- Total harmonic distortion (%)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
158 ipeak REAL, -- Peak drain current (A)
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
159 cost REAL -- Calculated cost metric
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
160 );''')
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
161
10
2832aefd442c Add 'no driver' version which can simulate in normal mode.
Daniel O'Connor <darius@dons.net.au>
parents:
diff changeset
162 return differential_evolution(fn, bounds, x0 = x0,
14
ac2ff6be22f7 Take circuit name in top level function.
Daniel O'Connor <darius@dons.net.au>
parents: 12
diff changeset
163 args = (dsn, '/Users/oconnd1/bin/runltspice', [], 'tmp', circ),
12
49939e179c86 Run 4 simulations at once.
Daniel O'Connor <darius@dons.net.au>
parents: 11
diff changeset
164 integrality = True, disp = True, seed = 12345, updating = 'deferred', workers = 4)