13
13
import pyomo .common .unittest as unittest
14
14
import pyomo .environ as pyo
15
15
from pyomo .opt .base .solvers import UnknownSolver
16
- from pyomo .core .plugins .transform .scaling import ScaleModel
16
+ from pyomo .core .plugins .transform .scaling import ScaleModel , SuffixFinder
17
17
18
18
19
19
class TestScaleModelTransformation (unittest .TestCase ):
@@ -600,6 +600,13 @@ def con_rule(m, i):
600
600
self .assertAlmostEqual (pyo .value (model .zcon ), - 8 , 4 )
601
601
602
602
def test_get_float_scaling_factor_top_level (self ):
603
+ # Note: the transformation used to have a private method for
604
+ # finding suffix values (which this method tested). The
605
+ # transformation now leverages the SuffixFinder. To ensure that
606
+ # the SuffixFinder behaves in the same way as the original local
607
+ # method, we preserve these tests, but directly test the
608
+ # SuffixFinder
609
+
603
610
m = pyo .ConcreteModel ()
604
611
m .scaling_factor = pyo .Suffix (direction = pyo .Suffix .EXPORT )
605
612
@@ -616,17 +623,23 @@ def test_get_float_scaling_factor_top_level(self):
616
623
m .scaling_factor [m .v1 ] = 0.1
617
624
m .scaling_factor [m .b1 .v2 ] = 0.2
618
625
626
+ _finder = SuffixFinder ('scaling_factor' , 1.0 , m )
627
+
619
628
# SF should be 0.1 from top level
620
- sf = ScaleModel ()._get_float_scaling_factor (m .v1 )
621
- assert sf == float (0.1 )
629
+ self .assertEqual (_finder .find (m .v1 ), 0.1 )
622
630
# SF should be 0.1 from top level, lower level ignored
623
- sf = ScaleModel ()._get_float_scaling_factor (m .b1 .v2 )
624
- assert sf == float (0.2 )
631
+ self .assertEqual (_finder .find (m .b1 .v2 ), 0.2 )
625
632
# No SF, should return 1
626
- sf = ScaleModel ()._get_float_scaling_factor (m .b1 .b2 .v3 )
627
- assert sf == 1.0
633
+ self .assertEqual (_finder .find (m .b1 .b2 .v3 ), 1.0 )
628
634
629
635
def test_get_float_scaling_factor_local_level (self ):
636
+ # Note: the transformation used to have a private method for
637
+ # finding suffix values (which this method tested). The
638
+ # transformation now leverages the SuffixFinder. To ensure that
639
+ # the SuffixFinder behaves in the same way as the original local
640
+ # method, we preserve these tests, but directly test the
641
+ # SuffixFinder
642
+
630
643
m = pyo .ConcreteModel ()
631
644
m .scaling_factor = pyo .Suffix (direction = pyo .Suffix .EXPORT )
632
645
@@ -647,15 +660,21 @@ def test_get_float_scaling_factor_local_level(self):
647
660
# Add an intermediate scaling factor - this should take priority
648
661
m .b1 .scaling_factor [m .b1 .b2 .v3 ] = 0.4
649
662
663
+ _finder = SuffixFinder ('scaling_factor' , 1.0 , m )
664
+
650
665
# Should get SF from local levels
651
- sf = ScaleModel ()._get_float_scaling_factor (m .v1 )
652
- assert sf == float (0.1 )
653
- sf = ScaleModel ()._get_float_scaling_factor (m .b1 .v2 )
654
- assert sf == float (0.2 )
655
- sf = ScaleModel ()._get_float_scaling_factor (m .b1 .b2 .v3 )
656
- assert sf == float (0.4 )
666
+ self .assertEqual (_finder .find (m .v1 ), 0.1 )
667
+ self .assertEqual (_finder .find (m .b1 .v2 ), 0.2 )
668
+ self .assertEqual (_finder .find (m .b1 .b2 .v3 ), 0.4 )
657
669
658
670
def test_get_float_scaling_factor_intermediate_level (self ):
671
+ # Note: the transformation used to have a private method for
672
+ # finding suffix values (which this method tested). The
673
+ # transformation now leverages the SuffixFinder. To ensure that
674
+ # the SuffixFinder behaves in the same way as the original local
675
+ # method, we preserve these tests, but directly test the
676
+ # SuffixFinder
677
+
659
678
m = pyo .ConcreteModel ()
660
679
m .scaling_factor = pyo .Suffix (direction = pyo .Suffix .EXPORT )
661
680
@@ -680,15 +699,14 @@ def test_get_float_scaling_factor_intermediate_level(self):
680
699
681
700
m .b1 .b2 .b3 .scaling_factor [m .b1 .b2 .b3 .v3 ] = 0.4
682
701
702
+ _finder = SuffixFinder ('scaling_factor' , 1.0 , m )
703
+
683
704
# v1 should be unscaled as SF set below variable level
684
- sf = ScaleModel ()._get_float_scaling_factor (m .v1 )
685
- assert sf == 1.0
705
+ self .assertEqual (_finder .find (m .v1 ), 1.0 )
686
706
# v2 should get SF from b1 level
687
- sf = ScaleModel ()._get_float_scaling_factor (m .b1 .b2 .b3 .v2 )
688
- assert sf == float (0.2 )
707
+ self .assertEqual (_finder .find (m .b1 .b2 .b3 .v2 ), 0.2 )
689
708
# v2 should get SF from highest level, ignoring b3 level
690
- sf = ScaleModel ()._get_float_scaling_factor (m .b1 .b2 .b3 .v3 )
691
- assert sf == float (0.3 )
709
+ self .assertEqual (_finder .find (m .b1 .b2 .b3 .v3 ), 0.3 )
692
710
693
711
694
712
if __name__ == "__main__" :
0 commit comments