Beispiel #1
0
 def est_plot_last_search( self ):
     import solverLib
     from solverLib import solve_via_Newtons_method, rand, SearchAnalyticsWrapper
     maxStep = [0.5, 0.5]
     xRoots = solve_via_Newtons_method( SearchAnalyticsWrapper(self.f1), rand(2)+3, maxStep, x_tol=0, debugPrintLevel=3, f_tol=10**-12)
     print( solverLib.analytics['lastSearch'] )
     solverLib.analytics['lastSearch'].plot()
Beispiel #2
0
 def est_plot_last_search( self ):
     import solverLib
     from solverLib import solve_via_Newtons_method, rand, SearchAnalyticsWrapper
     maxStep = [0.5, 0.5]
     xRoots = solve_via_Newtons_method( SearchAnalyticsWrapper(self.f1), rand(2)+3, maxStep, x_tol=0, debugPrintLevel=3, f_tol=10**-12)
     print( solverLib.analytics['lastSearch'] )
     solverLib.analytics['lastSearch'].plot()
Beispiel #3
0
 def test_solve_via_Newtons_method(self):
     from solverLib import solve_via_Newtons_method, rand
     maxStep = [0.5, 0.5]
     xMin = solve_via_Newtons_method(self.f1,
                                     rand(2) + 3,
                                     maxStep,
                                     x_tol=0,
                                     debugPrintLevel=0)
     self.assertAllClose(xMin, [2, -1])
Beispiel #4
0
 def test_gradient_approx_1( self ):
     'test on a function which returns a single value'
     from solverLib import GradientApproximatorRandomPoints, GradientApproximatorForwardDifference, GradientApproximatorCentralDifference, rand
     grad_f_rp = GradientApproximatorRandomPoints(self.f2)
     grad_f_fd = GradientApproximatorForwardDifference(self.f2)
     grad_f_cd = GradientApproximatorCentralDifference(self.f2)
     for i in range(2):
         X = rand(2)*10-5
         #print('    X %s' % X)
         #print('    grad_f(X) analytical:   %s' % grad_f2(X))
         #print('    grad_f(X) randomPoints: %s' % grad_f_rp(X))
         #print('    grad_f(X) forwardDiff.: %s' % grad_f_fd(X))
         #print('    grad_f(X) centralDiff.: %s' % grad_f_cd(X))
         #print('  norm(analytical-randomPoints) %e' % norm(grad_f2(X) - grad_f_rp(X)) )
         self.assertAllClose( self.grad_f2(X),  grad_f_rp(X) )
         self.assertAllClose( self.grad_f2(X),  grad_f_fd(X) )
         self.assertAllClose( self.grad_f2(X),  grad_f_cd(X) )
Beispiel #5
0
 def test_gradient_approx_1(self):
     'test on a function which returns a single value'
     from solverLib import GradientApproximatorRandomPoints, GradientApproximatorForwardDifference, GradientApproximatorCentralDifference, rand
     grad_f_rp = GradientApproximatorRandomPoints(self.f2)
     grad_f_fd = GradientApproximatorForwardDifference(self.f2)
     grad_f_cd = GradientApproximatorCentralDifference(self.f2)
     for i in range(2):
         X = rand(2) * 10 - 5
         #print('    X %s' % X)
         #print('    grad_f(X) analytical:   %s' % grad_f2(X))
         #print('    grad_f(X) randomPoints: %s' % grad_f_rp(X))
         #print('    grad_f(X) forwardDiff.: %s' % grad_f_fd(X))
         #print('    grad_f(X) centralDiff.: %s' % grad_f_cd(X))
         #print('  norm(analytical-randomPoints) %e' % norm(grad_f2(X) - grad_f_rp(X)) )
         self.assertAllClose(self.grad_f2(X), grad_f_rp(X))
         self.assertAllClose(self.grad_f2(X), grad_f_fd(X))
         self.assertAllClose(self.grad_f2(X), grad_f_cd(X))
Beispiel #6
0
 def test_gradient_approx_2( self ):
     'test on a function which returns multiple values'
     from solverLib import GradientApproximatorRandomPoints, GradientApproximatorForwardDifference, GradientApproximatorCentralDifference, rand
     grad_f_rp = GradientApproximatorRandomPoints( self.f1 )
     grad_f_fd = GradientApproximatorForwardDifference( self.f1 )
     grad_f_cd = GradientApproximatorCentralDifference( self.f1 )
     for i in range(2):
         X = rand(2)*10-5
         #print('  X %s' % X)
         #print('  grad_f(X) analytical:')
         #prettyPrintArray(grad_f1(X), toStdOut, '    ','%1.6e')
         #print('  grad_f(X) randomPoints:')
         #prettyPrintArray(grad_f_rp(X), toStdOut, '    ','%1.6e')
         #print('  grad_f(X) forwardDiff:')
         #prettyPrintArray(grad_f_fd(X), toStdOut, '    ','%1.6e')
         #print('  grad_f(X) centralDiff:')
         #prettyPrintArray(grad_f_cd(X), toStdOut, '    ','%1.6e')
         #print('  error rp %e' % norm(grad_f1(X) - grad_f_rp(X)))
         self.assertAllClose( self.grad_f1(X),  grad_f_rp(X) )
Beispiel #7
0
 def test_gradient_approx_2(self):
     'test on a function which returns multiple values'
     from solverLib import GradientApproximatorRandomPoints, GradientApproximatorForwardDifference, GradientApproximatorCentralDifference, rand
     grad_f_rp = GradientApproximatorRandomPoints(self.f1)
     grad_f_fd = GradientApproximatorForwardDifference(self.f1)
     grad_f_cd = GradientApproximatorCentralDifference(self.f1)
     for i in range(2):
         X = rand(2) * 10 - 5
         #print('  X %s' % X)
         #print('  grad_f(X) analytical:')
         #prettyPrintArray(grad_f1(X), toStdOut, '    ','%1.6e')
         #print('  grad_f(X) randomPoints:')
         #prettyPrintArray(grad_f_rp(X), toStdOut, '    ','%1.6e')
         #print('  grad_f(X) forwardDiff:')
         #prettyPrintArray(grad_f_fd(X), toStdOut, '    ','%1.6e')
         #print('  grad_f(X) centralDiff:')
         #prettyPrintArray(grad_f_cd(X), toStdOut, '    ','%1.6e')
         #print('  error rp %e' % norm(grad_f1(X) - grad_f_rp(X)))
         self.assertAllClose(self.grad_f1(X), grad_f_rp(X))
Beispiel #8
0
    def test( self ):
        from degreesOfFreedom import PlacementDegreeOfFreedom, LinearMotionDegreeOfFreedom, AxisRotationDegreeOfFreedom, pi, normalize
        from numpy.random import rand
        from variableManager import VariableManager
        #print('creating test FreeCAD document, constraining a single Cube')
        import FreeCAD, Part
        FreeCAD.newDocument("testDoc")
        #FreeCAD.setActiveDocument("box")
        #FreeCAD.ActiveDocument = FreeCAD.getDocument("box")
        objName = "box"
        box = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", objName)
        box.Shape = Part.makeBox(2,3,2)
        #FreeCAD.ActiveDocument.recompute()
        box.Placement.Base.x = rand()
        box.Placement.Base.y = rand() + 1
        box.Placement.Base.z = rand() + 2
        #print(box.Placement)

        class FakeSystem:
            def __init__(self, variableManager):
                self.variableManager = variableManager

        vM = VariableManager(FreeCAD.ActiveDocument)
        #print(vM.X)
        constaintSystem = FakeSystem(vM)
    
        #print('\nTesting PlacementDegreeOfFreedom')
        for object_dof in range(6):
            d = PlacementDegreeOfFreedom( constaintSystem, objName, object_dof )
            #print(d)
            for i in range(6):
                value = pi*( rand() - 0.5 )
                d.setValue(value)
                assert d.getValue() == value

        #print('\nTesting LinearMotionDegreeOfFreedom')
        tol = 10**-14
        for i in range(3):
            d = LinearMotionDegreeOfFreedom( constaintSystem, objName )
            d.setDirection( normalize(rand(3) - 0.5) )
            #print(d)
            for i in range(12):
                value = 12*( rand() - 0.5 )
                d.setValue(value)
                returnedValue = d.getValue()
                if abs(returnedValue - value) > tol :
                    raise ValueError("d.getValue() - value != %1.0e, [diff %e]" % (tol, returnedValue - value))

        #print('\nTesting AxisRotationDegreeOfFreedom')
        tol = 10**-12
        for i in range(3):
            d = AxisRotationDegreeOfFreedom( constaintSystem, objName )
            axis_r =  normalize(rand(3) - 0.5) #axis in parts co-ordinate system (i.e. relative to part)
            axis = normalize(rand(3) - 0.5) # desired axis in global co-ordinate system
            d.setAxis(  axis, axis_r )
            d.setValue(0) #update azi,ela,theta to statify aligment of axis vector
            #print(d)
            for i in range(6):
                value = 2*pi*( rand() - 0.5 )
                d.setValue(value)
                returnedValue = d.getValue()
                #print('  d.getValue() %f value %f, diff %e' % (returnedValue, value, returnedValue - value))
                if abs(returnedValue - value) > tol :
                    raise ValueError("d.getValue() - value != %1.0e, [diff %e]" % (tol, returnedValue - value))
Beispiel #9
0
 def test_solve_via_Newtons_method( self ):
     from solverLib import solve_via_Newtons_method, rand
     maxStep = [0.5, 0.5]
     xMin = solve_via_Newtons_method( self.f1, rand(2)+3, maxStep, x_tol=0, debugPrintLevel=0 )
     self.assertAllClose( xMin, [2, -1 ] )
Beispiel #10
0
    def test(self):
        from degreesOfFreedom import PlacementDegreeOfFreedom, LinearMotionDegreeOfFreedom, AxisRotationDegreeOfFreedom, pi, normalize
        from numpy.random import rand
        from variableManager import VariableManager
        #print('creating test FreeCAD document, constraining a single Cube')
        import FreeCAD, Part
        FreeCAD.newDocument("testDoc")
        #FreeCAD.setActiveDocument("box")
        #FreeCAD.ActiveDocument = FreeCAD.getDocument("box")
        objName = "box"
        box = FreeCAD.ActiveDocument.addObject("Part::FeaturePython", objName)
        box.Shape = Part.makeBox(2, 3, 2)
        #FreeCAD.ActiveDocument.recompute()
        box.Placement.Base.x = rand()
        box.Placement.Base.y = rand() + 1
        box.Placement.Base.z = rand() + 2

        #print(box.Placement)

        class FakeSystem:
            def __init__(self, variableManager):
                self.variableManager = variableManager

        vM = VariableManager(FreeCAD.ActiveDocument)
        #print(vM.X)
        constaintSystem = FakeSystem(vM)

        #print('\nTesting PlacementDegreeOfFreedom')
        for object_dof in range(6):
            d = PlacementDegreeOfFreedom(constaintSystem, objName, object_dof)
            #print(d)
            for i in range(6):
                value = pi * (rand() - 0.5)
                d.setValue(value)
                assert d.getValue() == value

        #print('\nTesting LinearMotionDegreeOfFreedom')
        tol = 10**-14
        for i in range(3):
            d = LinearMotionDegreeOfFreedom(constaintSystem, objName)
            d.setDirection(normalize(rand(3) - 0.5))
            #print(d)
            for i in range(12):
                value = 12 * (rand() - 0.5)
                d.setValue(value)
                returnedValue = d.getValue()
                if abs(returnedValue - value) > tol:
                    raise ValueError(
                        "d.getValue() - value != %1.0e, [diff %e]" %
                        (tol, returnedValue - value))

        #print('\nTesting AxisRotationDegreeOfFreedom')
        tol = 10**-12
        for i in range(3):
            d = AxisRotationDegreeOfFreedom(constaintSystem, objName)
            axis_r = normalize(
                rand(3) -
                0.5)  #axis in parts co-ordinate system (i.e. relative to part)
            axis = normalize(rand(3) -
                             0.5)  # desired axis in global co-ordinate system
            d.setAxis(axis, axis_r)
            d.setValue(
                0)  #update azi,ela,theta to statify aligment of axis vector
            #print(d)
            for i in range(6):
                value = 2 * pi * (rand() - 0.5)
                d.setValue(value)
                returnedValue = d.getValue()
                #print('  d.getValue() %f value %f, diff %e' % (returnedValue, value, returnedValue - value))
                if abs(returnedValue - value) > tol:
                    raise ValueError(
                        "d.getValue() - value != %1.0e, [diff %e]" %
                        (tol, returnedValue - value))