import json
import numpy as np
import pytest
try:
from ._settings import BASE_DIR, WIN32
except ImportError:
from _settings import BASE_DIR, WIN32
if WIN32:
# When running pytest, the faulthandler seems too eager to grab FPC's exceptions, even when handled
import faulthandler
faulthandler.disable()
import altdss
faulthandler.enable()
else:
import altdss
def test_float64_ops():
from altdss import altdss
altdss(f'redirect "{BASE_DIR}/Version8/Distrib/IEEETestCases/13Bus/IEEE13Nodeckt.dss"')
dss2 = altdss.NewContext()
dss2(f'redirect "{BASE_DIR}/Version8/Distrib/IEEETestCases/13Bus/IEEE13Nodeckt.dss"')
# Test an explicit batch of 3-phase loads -- broadcast value
load_batch = altdss.Load.batch(Phases=1)
original_kW = load_batch.kW.to_list()
original_Class = load_batch.Class.to_list()
load_batch.kW = 1.123
assert load_batch.kW.to_list() == [1.123 for l in altdss.Load if l.Phases == 1]
load_batch.Class = 941
assert load_batch.Class.to_list() == [941 for l in altdss.Load if l.Phases == 1]
# Reset -- test array assigns
altdss(f'redirect "{BASE_DIR}/Version8/Distrib/IEEETestCases/13Bus/IEEE13Nodeckt.dss"')
load_batch = altdss.Load.batch(Phases=1)
load_batch.kW = [1.123] * len(load_batch)
assert load_batch.kW.to_list() == [1.123 for l in altdss.Load if l.Phases == 1]
with pytest.raises(ValueError):
load_batch.kW = [1.123] * (len(load_batch) - 1)
load_batch.Class = [941] * len(load_batch)
assert load_batch.Class.to_list() == [941 for l in altdss.Load if l.Phases == 1]
with pytest.raises(ValueError):
load_batch.Class = [941] * (len(load_batch) - 1)
# Check with the other instance
load_batch2 = dss2.Load.batch(Phases=1)
assert len(load_batch) == len(load_batch2)
load_batch.kW = load_batch2.kW
load_batch.Class = load_batch2.Class
assert load_batch.kW.to_list() == original_kW
assert load_batch.Class.to_list() == original_Class
# Reset and do other tests
altdss(f'redirect "{BASE_DIR}/Version8/Distrib/IEEETestCases/13Bus/IEEE13Nodeckt.dss"')
kW_for_each = [l.kW for l in altdss.Load]
kW_ap = altdss.Load.kW
assert list(kW_ap // 2) == [x // 2 for x in kW_for_each]
assert list(kW_ap + 2.1) == [x + 2.1 for x in kW_for_each]
assert list(kW_ap - 153.2) == [x - 153.2 for x in kW_for_each]
assert len(kW_ap) == len(kW_for_each)
assert isinstance(kW_ap.to_array(), np.ndarray)
assert isinstance(kW_ap(), np.ndarray)
assert kW_ap.to_list() == kW_for_each
assert [x for x in kW_ap] == kW_for_each
np.testing.assert_almost_equal(altdss.Load.kW / 1.1, [x / 1.1 for x in kW_for_each])
altdss.Load.kW /= 1.1
np.testing.assert_almost_equal(kW_ap.to_list(), [x / 1.1 for x in kW_for_each])
with pytest.raises(ValueError):
# Provide wrong number of elements
altdss.Load.kW += [0.0] * (len(altdss.Load) - 1)
altdss.Load.kW += [0.1] * (len(altdss.Load))
altdss.Load.kW -= 0.1
np.testing.assert_almost_equal(altdss.Load.kW, [x / 1.1 for x in kW_for_each])
altdss.Load.kW -= [0.5] * (len(altdss.Load))
altdss.Load.kW += 0.5
np.testing.assert_almost_equal(altdss.Load.kW, [x / 1.1 for x in kW_for_each])
altdss.Load.kW *= [1.0] * (len(altdss.Load))
altdss.Load.kW *= np.ones(len(altdss.Load)) * 2.0
np.testing.assert_almost_equal(altdss.Load.kW, [2 * (x / 1.1) for x in kW_for_each])
with pytest.raises(ValueError):
altdss.Load.kW *= np.ones(len(altdss.Load) - 1) * 2.0
altdss.Load.kW /= np.ones(len(altdss.Load)) * 2.0
np.testing.assert_almost_equal(altdss.Load.kW, [(x / 1.1) for x in kW_for_each])
with pytest.raises(ValueError):
altdss.Load.kW /= np.ones(len(altdss.Load) - 1) * 2.0
def test_int32_ops():
from altdss import altdss
altdss(f'redirect "{BASE_DIR}/Version8/Distrib/IEEETestCases/13Bus/IEEE13Nodeckt.dss"')
phases = altdss.Load.Phases.to_list()
phases_arr = altdss.Load.Phases()
assert len(altdss.Load) == len(altdss.Load.Phases)
assert list(phases_arr) == phases
assert [x for x in altdss.Load.Phases] == phases
assert tuple(altdss.Load.Phases * 10) == tuple(10 * x for x in phases)
np.testing.assert_equal(np.asarray(altdss.Load.Phases), phases_arr)
np.testing.assert_equal(np.asarray(altdss.Load.Phases), phases_arr)
altdss.Load.Class = 10
assert altdss.Load.Class.to_list() == [10] * len(altdss.Load)
altdss.Load.Class *= 3
assert altdss.Load.Class.to_list() == [30] * len(altdss.Load)
assert (altdss.Load.Class - 25).tolist() == [5] * len(altdss.Load)
with pytest.raises(ValueError):
altdss.Load.Class = [2] * (len(altdss.Load) - 1)
altdss.Load.Class = [4] * len(altdss.Load)
assert altdss.Load.Class.to_list() == [4] * len(altdss.Load)
assert list(altdss.Load.Class / 4) == [1] * len(altdss.Load)
assert list(altdss.Load.Class // 4) == [1] * len(altdss.Load)
assert list((altdss.Load.Class + 1) // 2) == [2] * len(altdss.Load)
altdss.Load.Class += 1
assert list(altdss.Load.batch().Class) == [5] * len(altdss.Load)
with pytest.raises(ValueError):
altdss.Load.Class += list(range(len(altdss.Load) - 1))
prev_list = altdss.Load.Class.to_list()
altdss.Load.Class += list(range(len(altdss.Load)))
assert list(altdss.Load.batch().Class) == [i + c for i, c in zip(range(len(altdss.Load)), prev_list)]
altdss.Load.Class -= list(range(len(altdss.Load)))
assert list(altdss.Load.batch().Class) == prev_list
with pytest.raises(ValueError):
altdss.Load.Class *= [3] * (len(altdss.Load) - 1)
altdss.Load.Class *= [3] * len(altdss.Load)
assert list(altdss.Load.batch().Class) == [3 * x for x in prev_list]
assert list((altdss.Load.Class) // 3) == prev_list
altdss.Load.Class //= 2
assert altdss.Load.Class.to_list() == [7] * len(altdss.Load)
with pytest.raises(ValueError):
altdss.Load.Class //= [2, 3, 4]
altdss.Load.Class *= 6 # == 7 * 6
altdss.Load.Class //= [2, 3] * (len(altdss.Load) // 2) + [1] # [21, 14, ..., 42]
assert list(altdss.Load.Class) == ([21, 14] * (len(altdss.Load) // 2) + [42])
if __name__ == '__main__':
test_int32_ops()