Salome HOME
New complete example of OptimizerLoop plugin.
authorOvidiu Mircescu <ovidiu.mircescu@edf.fr>
Tue, 15 Jul 2014 15:15:49 +0000 (17:15 +0200)
committerOvidiu Mircescu <ovidiu.mircescu@edf.fr>
Wed, 23 Jul 2014 09:32:11 +0000 (11:32 +0200)
The new test examples use every function of the plugin interface.
Also, the sphinx doc includes the test files directly.

doc/optimizer.rst
src/yacsloader/Test/OptimizerAlgASyncExample.cxx
src/yacsloader/Test/OptimizerAlgSyncExample.cxx
src/yacsloader/Test/algoasyncexample.py
src/yacsloader/Test/algosyncexample.py
src/yacsloader/samples/optimizer_async_cpp.xml
src/yacsloader/samples/optimizer_async_py.xml
src/yacsloader/samples/optimizer_sync_cpp.xml
src/yacsloader/samples/optimizer_sync_py.xml

index 9fda369578756e93fe7fd1afef53e991997b080c..5ea0cfd010e6b226efcda27819c121a9426f215a 100644 (file)
@@ -32,191 +32,17 @@ C++ plugin example
 ''''''''''''''''''''
 Here is a small example of a C++ synchronous algorithm:
 
-.. code-block:: cpp
-
-  #include <cmath>
-  
-  #include "OptimizerAlg.hxx"
-  
-  using namespace YACS::ENGINE;
-  
-  extern "C"
-  {
-    OptimizerAlgBase * createOptimizerAlgSyncExample(Pool * pool);
-  }
-  
-  class OptimizerAlgSyncExample : public OptimizerAlgSync
-    {
-    private:
-      int _idTest;
-      TypeCode *_tcIn;
-      TypeCode *_tcOut;
-    public:
-      OptimizerAlgSyncExample(Pool *pool);
-      virtual ~OptimizerAlgSyncExample();
-      TypeCode *getTCForIn() const;
-      TypeCode *getTCForOut() const;
-      void start();
-      void takeDecision();
-      void initialize(const Any *input) throw(YACS::Exception);
-      void finish();
-    };
-  
-  OptimizerAlgSyncExample::OptimizerAlgSyncExample(Pool *pool)
-    : OptimizerAlgSync(pool), _tcIn(0), _tcOut(0), _idTest(0)
-  {
-    _tcIn=new TypeCode(Double);
-    _tcOut=new TypeCode(Int);
-  }
-  
-  OptimizerAlgSyncExample::~OptimizerAlgSyncExample()
-  {
-    _tcIn->decrRef();
-    _tcOut->decrRef();
-  }
-  
-  //! Return the typecode of the expected input type
-  TypeCode * OptimizerAlgSyncExample::getTCForIn() const
-  {
-    return _tcIn;
-  }
-  
-  //! Return the typecode of the expected output type
-  TypeCode * OptimizerAlgSyncExample::getTCForOut() const
-  {
-    return _tcOut;
-  }
-  
-  //! Start to fill the pool with samples to evaluate
-  void OptimizerAlgSyncExample::start()
-  {
-    _idTest=0;
-    Any *val=AtomAny::New(1.2);
-    _pool->pushInSample(4,val);
-    val=AtomAny::New(3.4);
-    _pool->pushInSample(9,val);
-  }
-  
-  //! This method is called each time a sample has been evaluated.
-  /*!
-   *  It can either add new samples to evaluate in the pool, do nothing (wait
-   *  for more samples), or empty the pool to finish the evaluation.
-   */
-  void OptimizerAlgSyncExample::takeDecision()
-  {
-    if(_idTest==1)
-      {
-        Any *val=AtomAny::New(5.6);
-        _pool->pushInSample(16,val);
-        val=AtomAny::New(7.8);
-        _pool->pushInSample(25,val);
-        val=AtomAny::New(9. );
-        _pool->pushInSample(36,val);
-        val=AtomAny::New(12.3);
-        _pool->pushInSample(49,val);
-      }
-    else if(_idTest==4)
-      {
-        Any *val=AtomAny::New(45.6);
-        _pool->pushInSample(64,val);
-        val=AtomAny::New(78.9);
-        _pool->pushInSample(81,val);
-      }
-    else
-      {
-        Any *tmp= _pool->getCurrentInSample();
-        if(fabs(tmp->getDoubleValue()-45.6)<1.e-12)
-          _pool->destroyAll();
-      }
-    _idTest++;
-  }
-  
-  //! Optional method to initialize the algorithm.
-  /*!
-   *  For now, the parameter input is always NULL. It might be used in the
-   *  future to initialize an algorithm with custom data.
-   */
-  void OptimizerAlgSyncExample::initialize(const Any *input)
-    throw (YACS::Exception)
-  {
-  }
-  
-  /*!
-   *  Optional method called when the algorithm has finished, successfully or
-   *  not, to perform any necessary clean up.
-   */
-  void OptimizerAlgSyncExample::finish()
-  {
-  }
-  
-  //! Factory method to create the algorithm.
-  OptimizerAlgBase * createOptimizerAlgSyncExample(Pool *pool)
-  {
-    return new OptimizerAlgSyncExample(pool);
-  }
-
+.. literalinclude:: ../src/yacsloader/Test/OptimizerAlgSyncExample.cxx
+    :language: cpp
 
 Here, the entry point in the dynamic library is the name of the factory function : createOptimizerAlgSyncExample
 that returns an instance of the OptimizerAlgSyncExample class that implements the algorithm.
 
 Python plugin example
 ''''''''''''''''''''''
-Here, the same example of a synchronous algorithm in Python::
+Here, the same example of a synchronous algorithm in Python:
 
-  import SALOMERuntime
-  
-  class myalgosync(SALOMERuntime.OptimizerAlgSync):
-    def __init__(self):
-      SALOMERuntime.OptimizerAlgSync.__init__(self, None)
-      r=SALOMERuntime.getSALOMERuntime()
-      self.tin=r.getTypeCode("double")
-      self.tout=r.getTypeCode("int")
-  
-    def setPool(self,pool):
-      """Must be implemented to set the pool"""
-      self.pool=pool
-  
-    def getTCForIn(self):
-      """returns typecode of type expected as Input"""
-      return self.tin
-  
-    def getTCForOut(self):
-      """returns typecode of type expected as Output"""
-      return self.tout
-  
-    def initialize(self,input):
-      """Optional method called on initialization. Do nothing here"""
-  
-    def start(self):
-      """Start to fill the pool with samples to evaluate."""
-      self.iter=0
-      self.pool.pushInSample(4,1.2)
-      self.pool.pushInSample(9,3.4)
-  
-    def takeDecision(self):
-      """ This method is called each time a sample has been evaluated. It can
-          either add new samples to evaluate in the pool, do nothing (wait for
-          more samples), or empty the pool to finish the evaluation.
-      """
-      currentId=self.pool.getCurrentId()
-  
-      if self.iter==1:
-        self.pool.pushInSample(16,5.6)
-        self.pool.pushInSample(25,7.8)
-        self.pool.pushInSample(36,9.)
-        self.pool.pushInSample(49,12.3)
-      elif self.iter==4:
-        self.pool.pushInSample(64,45.6)
-        self.pool.pushInSample(81,78.9)
-      else:
-        val=self.pool.getCurrentInSample()
-        if abs(val.getDoubleValue()-45.6) < 1.e-12:
-          self.pool.destroyAll()
-      self.iter=self.iter+1
-  
-    def finish(self):
-      """Optional method called when the algorithm has finished, successfully
-         or not, to perform any necessary clean up. Do nothing here"""
+.. literalinclude:: ../src/yacsloader/Test/algosyncexample.py
 
 Here, the entry point in the Python module is directly the name of the class that implements the algorithm : myalgosync.
 
@@ -243,94 +69,8 @@ C++ plugin example
 ''''''''''''''''''''
 Here is a small example of a C++ asynchronous algorithm:
 
-.. code-block:: cpp
-
-  #include "OptimizerAlg.hxx"
-  
-  using namespace YACS::ENGINE;
-  
-  extern "C"
-  {
-    OptimizerAlgBase * createOptimizerAlgASyncExample(Pool * pool);
-  }
-  
-  class OptimizerAlgASyncExample : public OptimizerAlgASync
-    {
-    private:
-      TypeCode * _tcIn;
-      TypeCode * _tcOut;
-    public:
-      OptimizerAlgASyncExample(Pool * pool);
-      virtual ~OptimizerAlgASyncExample();
-      TypeCode * getTCForIn() const;
-      TypeCode * getTCForOut() const;
-      void startToTakeDecision();
-    };
-  
-  OptimizerAlgASyncExample::OptimizerAlgASyncExample(Pool * pool)
-    : OptimizerAlgASync(pool), _tcIn(0), _tcOut(0)
-  {
-    _tcIn = new TypeCode(Double);
-    _tcOut = new TypeCode(Int);
-  }
-  
-  OptimizerAlgASyncExample::~OptimizerAlgASyncExample()
-  {
-    _tcIn->decrRef();
-    _tcOut->decrRef();
-  }
-  
-  //! Return the typecode of the expected input type
-  TypeCode *OptimizerAlgASyncExample::getTCForIn() const
-  {
-    return _tcIn;
-  }
-  
-  //! Return the typecode of the expected output type
-  TypeCode *OptimizerAlgASyncExample::getTCForOut() const
-  {
-    return _tcOut;
-  }
-  
-  //! This method is called only once to launch the algorithm.
-  /*!
-   *  It must first fill the pool with samples to evaluate and call
-   *  signalMasterAndWait() to block until a sample has been evaluated. When
-   *  returning from this method, it MUST check for an eventual termination
-   *  request (with the method isTerminationRequested()). If the termination
-   *  is requested, the method must perform any necessary cleanup and return
-   *  as soon as possible. Otherwise it can either add new samples to evaluate
-   *  in the pool, do nothing (wait for more samples), or empty the pool and
-   *  return to finish the evaluation.
-   */
-  void OptimizerAlgASyncExample::startToTakeDecision()
-  {
-    double val = 1.2;
-    for (int i=0 ; i<5 ; i++) {
-      // push a sample in the input of the slave node
-      _pool->pushInSample(i, AtomAny::New(val));
-      // wait until next sample is ready
-      signalMasterAndWait();
-      // check error notification
-      if (isTerminationRequested()) {
-        _pool->destroyAll();
-        return;
-      }
-  
-      // get a sample from the output of the slave node
-      Any * v = _pool->getCurrentOutSample();
-      val += v->getIntValue();
-    }
-  
-    // in the end destroy the pool content
-    _pool->destroyAll();
-  }
-  
-  //! Factory method to create the algorithm.
-  OptimizerAlgBase * createOptimizerAlgASyncExample(Pool * pool)
-  {
-    return new OptimizerAlgASyncExample(pool);
-  }
+.. literalinclude:: ../src/yacsloader/Test/OptimizerAlgASyncExample.cxx
+    :language: cpp
 
 
 Here, the entry point in the dynamic library is the name of the factory function : createOptimizerAlgASyncExample
@@ -338,59 +78,9 @@ that returns an instance of the OptimizerAlgASyncExample class that implements t
 
 Python plugin example
 ''''''''''''''''''''''''
-Here is an example of an asynchronous algorithm implemented in Python::
+Here is an example of an asynchronous algorithm implemented in Python:
 
-  import SALOMERuntime
-  
-  class myalgoasync(SALOMERuntime.OptimizerAlgASync):
-    def __init__(self):
-      SALOMERuntime.OptimizerAlgASync.__init__(self, None)
-      r=SALOMERuntime.getSALOMERuntime()
-      self.tin=r.getTypeCode("double")
-      self.tout=r.getTypeCode("int")
-  
-    def setPool(self,pool):
-      """Must be implemented to set the pool"""
-      self.pool=pool
-  
-    def getTCForIn(self):
-      """returns typecode of type expected as Input"""
-      return self.tin
-  
-    def getTCForOut(self):
-      """returns typecode of type expected as Output"""
-      return self.tout
-  
-    def startToTakeDecision(self):
-      """This method is called only once to launch the algorithm. It must
-         first fill the pool with samples to evaluate and call
-         self.signalMasterAndWait() to block until a sample has been
-         evaluated. When returning from this method, it MUST check for an
-         eventual termination request (with the method
-         self.isTerminationRequested()). If the termination is requested, the
-         method must perform any necessary cleanup and return as soon as
-         possible. Otherwise it can either add new samples to evaluate in the
-         pool, do nothing (wait for more samples), or empty the pool and
-         return to finish the evaluation.
-      """
-      val=1.2
-      for iter in xrange(5):
-        #push a sample in the input of the slave node
-        self.pool.pushInSample(iter,val)
-        #wait until next sample is ready
-        self.signalMasterAndWait()
-        #check error notification
-        if self.isTerminationRequested():
-          self.pool.destroyAll()
-          return
-  
-        #get a sample from the output of the slave node
-        currentId=self.pool.getCurrentId()
-        v=self.pool.getCurrentOutSample()
-        val=val+v.getIntValue()
-  
-      #in the end destroy the pool content
-      self.pool.destroyAll()
+.. literalinclude:: ../src/yacsloader/Test/algoasyncexample.py
 
 Here, the entry point in the Python module is directly the name of the class that implements the algorithm : myalgoasync.
 
index 86bc84ecb3b8b16adca676b7d98f66ff93dc8ca1..34d4a0d4e9eda924cc3ebf85d15cd1688f82d860 100644 (file)
 
 #include "OptimizerAlg.hxx"
 
-using namespace YACS::ENGINE;
+#include <iostream>
+//using namespace YACS::ENGINE;
 
 extern "C"
 {
-  OptimizerAlgBase * createOptimizerAlgASyncExample(Pool * pool);
+  YACS::ENGINE::OptimizerAlgBase * createOptimizerAlgASyncExample(YACS::ENGINE::Pool * pool);
 }
 
-class OptimizerAlgASyncExample : public OptimizerAlgASync
-  {
+class OptimizerAlgASyncExample : public YACS::ENGINE::OptimizerAlgASync
+{
   private:
-    TypeCode * _tcIn;
-    TypeCode * _tcOut;
+    YACS::ENGINE::TypeCode *_tcInt;
+    YACS::ENGINE::TypeCode *_tcDouble;
   public:
-    OptimizerAlgASyncExample(Pool * pool);
+    OptimizerAlgASyncExample(YACS::ENGINE::Pool *pool);
     virtual ~OptimizerAlgASyncExample();
-    TypeCode * getTCForIn() const;
-    TypeCode * getTCForOut() const;
-    void startToTakeDecision();
-  };
+    
+    //! returns typecode of type expected as Input. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForIn() const;
+    //! returns typecode of type expected as Output. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForOut() const;
+    //! returns typecode of type expected for algo initialization. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForAlgoInit() const;
+    //! returns typecode of type expected as algo result. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForAlgoResult() const;
+    virtual void initialize(const YACS::ENGINE::Any *input) throw (YACS::Exception);
+    virtual void startToTakeDecision();
+    virtual void finish();//! Called when optimization has succeed.
+    virtual YACS::ENGINE::Any * getAlgoResult();
+};
 
-OptimizerAlgASyncExample::OptimizerAlgASyncExample(Pool * pool) : OptimizerAlgASync(pool),
-                                                                  _tcIn(0), _tcOut(0)
+OptimizerAlgASyncExample::OptimizerAlgASyncExample(YACS::ENGINE::Pool *pool)
+  : YACS::ENGINE::OptimizerAlgASync(pool), _tcInt(0), _tcDouble(0)
 {
-  _tcIn = new TypeCode(Double);
-  _tcOut = new TypeCode(Int);
+  _tcDouble = new YACS::ENGINE::TypeCode(YACS::ENGINE::Double);
+  _tcInt    = new YACS::ENGINE::TypeCode(YACS::ENGINE::Int);
 }
 
 OptimizerAlgASyncExample::~OptimizerAlgASyncExample()
 {
-  _tcIn->decrRef();
-  _tcOut->decrRef();
+  _tcDouble->decrRef();
+  _tcInt->decrRef();
+}
+
+//! Return the typecode of the expected input of the internal node
+YACS::ENGINE::TypeCode * OptimizerAlgASyncExample::getTCForIn() const
+{
+  return _tcDouble;
+}
+
+//! Return the typecode of the expected output of the internal node
+YACS::ENGINE::TypeCode * OptimizerAlgASyncExample::getTCForOut() const
+{
+  return _tcInt;
 }
 
-//! Return the typecode of the expected input type
-TypeCode *OptimizerAlgASyncExample::getTCForIn() const
+//! Return the typecode of the expected input of the algorithm (algoInit port)
+YACS::ENGINE::TypeCode * OptimizerAlgASyncExample::getTCForAlgoInit() const
 {
-  return _tcIn;
+  return _tcInt;
 }
 
-//! Return the typecode of the expected output type
-TypeCode *OptimizerAlgASyncExample::getTCForOut() const
+//! Return the typecode of the expected output of the algorithm (algoResult port)
+YACS::ENGINE::TypeCode * OptimizerAlgASyncExample::getTCForAlgoResult() const
 {
-  return _tcOut;
+  return _tcInt;
+}
+
+//! Optional method to initialize the algorithm.
+/*!
+ *  For now, the parameter input is always NULL. It might be used in the
+ *  future to initialize an algorithm with custom data.
+ */
+void OptimizerAlgASyncExample::initialize(const YACS::ENGINE::Any *input)
+  throw (YACS::Exception)
+{
+  std::cout << "Algo initialize, input = " << input->getIntValue() << std::endl;
 }
 
 //! This method is called only once to launch the algorithm.
 /*!
- *  It must first fill the pool with samples to evaluate and call signalMasterAndWait()
- *  to block until a sample has been evaluated. When returning from this method, it MUST
- *  check for an eventual termination request (with the method isTerminationRequested()).
- *  If the termination is requested, the method must perform any necessary cleanup and
- *  return as soon as possible. Otherwise it can either add new samples to evaluate in
- *  the pool, do nothing (wait for more samples), or empty the pool and return to finish
- *  the evaluation.
+ *  It must first fill the pool with samples to evaluate and call
+ *  signalMasterAndWait() to block until a sample has been evaluated. When
+ *  returning from this method, it MUST check for an eventual termination
+ *  request (with the method isTerminationRequested()). If the termination
+ *  is requested, the method must perform any necessary cleanup and return
+ *  as soon as possible. Otherwise it can either add new samples to evaluate
+ *  in the pool, do nothing (wait for more samples), or empty the pool and
+ *  return to finish the evaluation.
  */
 void OptimizerAlgASyncExample::startToTakeDecision()
 {
-  double val = 1.2;
-  for (int i=0 ; i<5 ; i++) {
-    // push a sample in the input of the slave node
-    _pool->pushInSample(i, AtomAny::New(val));
-    // wait until next sample is ready
-    signalMasterAndWait();
-    // check error notification
-    if (isTerminationRequested()) {
-      _pool->destroyAll();
-      return;
+  std::cout << "startToTakeDecision" << std::endl;
+  int iter = 0;
+  YACS::ENGINE::Any *val=YACS::ENGINE::AtomAny::New(0.5);
+  _pool->pushInSample(iter, val);
+  
+  signalMasterAndWait();
+  while(!isTerminationRequested())
+  {
+    int currentId = _pool->getCurrentId();
+    double valIn  = _pool->getCurrentInSample()->getDoubleValue();
+    int valOut    = _pool->getCurrentOutSample()->getIntValue();
+    
+    std::cout << "Compute currentId=" << currentId;
+    std::cout << ", valIn=" << valIn;
+    std::cout << ", valOut=" << valOut << std::endl;
+    
+    iter++;
+    if(iter < 3)
+    {
+      YACS::ENGINE::Any *val=YACS::ENGINE::AtomAny::New(valIn + 1);
+      _pool->pushInSample(iter, val);
     }
-
-    // get a sample from the output of the slave node
-    Any * v = _pool->getCurrentOutSample();
-    val += v->getIntValue();
+    signalMasterAndWait();
   }
+}
 
-  // in the end destroy the pool content
+/*!
+ *  Optional method called when the algorithm has finished, successfully or
+ *  not, to perform any necessary clean up.
+ */
+void OptimizerAlgASyncExample::finish()
+{
+  std::cout << "Algo finish" << std::endl;
   _pool->destroyAll();
 }
 
+/*!
+ *  Return the value of the algoResult port.
+ */
+YACS::ENGINE::Any * OptimizerAlgASyncExample::getAlgoResult()
+{
+  YACS::ENGINE::Any *val=YACS::ENGINE::AtomAny::New(42);
+  return val;
+}
+
 //! Factory method to create the algorithm.
-OptimizerAlgBase * createOptimizerAlgASyncExample(Pool * pool)
+YACS::ENGINE::OptimizerAlgBase * createOptimizerAlgASyncExample(YACS::ENGINE::Pool *pool)
 {
   return new OptimizerAlgASyncExample(pool);
-}
+}
\ No newline at end of file
index db7134fae5f807cf15daf7dc17316fcddb6d5d76..6161dbf9095c8f5639e6db2478843458351731f8 100644 (file)
 
 #include "OptimizerAlg.hxx"
 
-using namespace YACS::ENGINE;
+#include <iostream>
+//using namespace YACS::ENGINE;
 
 extern "C"
 {
-  OptimizerAlgBase * createOptimizerAlgSyncExample(Pool * pool);
+  YACS::ENGINE::OptimizerAlgBase * createOptimizerAlgSyncExample(YACS::ENGINE::Pool * pool);
 }
 
-class OptimizerAlgSyncExample : public OptimizerAlgSync
-  {
+class OptimizerAlgSyncExample : public YACS::ENGINE::OptimizerAlgSync
+{
   private:
-    int _idTest;
-    TypeCode *_tcIn;
-    TypeCode *_tcOut;
+    int _iter;
+    YACS::ENGINE::TypeCode *_tcInt;
+    YACS::ENGINE::TypeCode *_tcDouble;
   public:
-    OptimizerAlgSyncExample(Pool *pool);
+    OptimizerAlgSyncExample(YACS::ENGINE::Pool *pool);
     virtual ~OptimizerAlgSyncExample();
-    TypeCode *getTCForIn() const;
-    TypeCode *getTCForOut() const;
-    void start();
-    void takeDecision();
-    void initialize(const Any *input) throw(YACS::Exception);
-    void finish();
-  };
-
-OptimizerAlgSyncExample::OptimizerAlgSyncExample(Pool *pool) : OptimizerAlgSync(pool),
-                                                               _tcIn(0), _tcOut(0),
-                                                               _idTest(0)
+    
+    //! returns typecode of type expected as Input. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForIn() const;
+    //! returns typecode of type expected as Output. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForOut() const;
+    //! returns typecode of type expected for algo initialization. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForAlgoInit() const;
+    //! returns typecode of type expected as algo result. OwnerShip of returned pointer is held by this.
+    virtual YACS::ENGINE::TypeCode *getTCForAlgoResult() const;
+    virtual void initialize(const YACS::ENGINE::Any *input) throw (YACS::Exception);
+    virtual void start(); //! Update _pool attribute before performing anything.
+    virtual void takeDecision();//! _pool->getCurrentId gives the \b id at the origin of this call.
+                                //! Perform the job of analysing to know what new jobs to do (_pool->pushInSample)
+                                //! or in case of convergence _pool->destroyAll
+    virtual void finish();//! Called when optimization has succeed.
+    virtual YACS::ENGINE::Any * getAlgoResult();
+};
+
+OptimizerAlgSyncExample::OptimizerAlgSyncExample(YACS::ENGINE::Pool *pool)
+  : YACS::ENGINE::OptimizerAlgSync(pool), _tcInt(0), _tcDouble(0), _iter(0)
 {
-  _tcIn=new TypeCode(Double);
-  _tcOut=new TypeCode(Int);
+  _tcDouble = new YACS::ENGINE::TypeCode(YACS::ENGINE::Double);
+  _tcInt    = new YACS::ENGINE::TypeCode(YACS::ENGINE::Int);
 }
 
 OptimizerAlgSyncExample::~OptimizerAlgSyncExample()
 {
-  std::cout << "Destroying OptimizerAlgSyncExample" << std::endl;
-  _tcIn->decrRef();
-  _tcOut->decrRef();
-  std::cout << "Destroyed OptimizerAlgSyncExample" << std::endl;
+  _tcDouble->decrRef();
+  _tcInt->decrRef();
 }
 
-//! Return the typecode of the expected input type
-TypeCode * OptimizerAlgSyncExample::getTCForIn() const
+//! Return the typecode of the expected input of the internal node
+YACS::ENGINE::TypeCode * OptimizerAlgSyncExample::getTCForIn() const
 {
-  return _tcIn;
+  return _tcDouble;
 }
 
-//! Return the typecode of the expected output type
-TypeCode * OptimizerAlgSyncExample::getTCForOut() const
+//! Return the typecode of the expected output of the internal node
+YACS::ENGINE::TypeCode * OptimizerAlgSyncExample::getTCForOut() const
 {
-  return _tcOut;
+  return _tcInt;
+}
+
+//! Return the typecode of the expected input of the algorithm (algoInit port)
+YACS::ENGINE::TypeCode * OptimizerAlgSyncExample::getTCForAlgoInit() const
+{
+  return _tcInt;
+}
+
+//! Return the typecode of the expected output of the algorithm (algoResult port)
+YACS::ENGINE::TypeCode * OptimizerAlgSyncExample::getTCForAlgoResult() const
+{
+  return _tcInt;
+}
+
+//! Optional method to initialize the algorithm.
+/*!
+ *  For now, the parameter input is always NULL. It might be used in the
+ *  future to initialize an algorithm with custom data.
+ */
+void OptimizerAlgSyncExample::initialize(const YACS::ENGINE::Any *input)
+  throw (YACS::Exception)
+{
+  std::cout << "Algo initialize, input = " << input->getIntValue() << std::endl;
 }
 
 //! Start to fill the pool with samples to evaluate
 void OptimizerAlgSyncExample::start()
 {
-  _idTest=0;
-  Any *val=AtomAny::New(1.2);
-  _pool->pushInSample(4,val);
-  val=AtomAny::New(3.4);
-  _pool->pushInSample(9,val);
+  std::cout << "Algo start " << std::endl;
+  _iter=0;
+  YACS::ENGINE::Any *val=YACS::ENGINE::AtomAny::New(0.5);
+  _pool->pushInSample(_iter,val);
 }
 
 //! This method is called each time a sample has been evaluated.
 /*!
- *  It can either add new samples to evaluate in the pool, do nothing (wait for more
- *  samples), or empty the pool to finish the evaluation.
+ *  It can either add new samples to evaluate in the pool, do nothing (wait
+ *  for more samples), or empty the pool to finish the evaluation.
  */
 void OptimizerAlgSyncExample::takeDecision()
 {
-  if(_idTest==1)
-    {
-      Any *val=AtomAny::New(5.6);
-      _pool->pushInSample(16,val);
-      val=AtomAny::New(7.8);
-      _pool->pushInSample(25,val);
-      val=AtomAny::New(9. );
-      _pool->pushInSample(36,val);
-      val=AtomAny::New(12.3);
-      _pool->pushInSample(49,val);
-    }
-  else if(_idTest==4)
-    {
-      Any *val=AtomAny::New(45.6);
-      _pool->pushInSample(64,val);
-      val=AtomAny::New(78.9);
-      _pool->pushInSample(81,val);
-    }
-  else
-    {
-      Any *tmp= _pool->getCurrentInSample();
-      if(fabs(tmp->getDoubleValue()-45.6)<1.e-12)
-        _pool->destroyAll();
-    }
-  _idTest++;
+  int currentId = _pool->getCurrentId();
+  double valIn  = _pool->getCurrentInSample()->getDoubleValue();
+  int valOut    = _pool->getCurrentOutSample()->getIntValue();
+  
+  std::cout << "Algo takeDecision currentId=" << currentId;
+  std::cout << ", valIn=" << valIn;
+  std::cout << ", valOut=" << valOut << std::endl;
+  
+  _iter++;
+  if(_iter < 3)
+  {
+    YACS::ENGINE::Any *val=YACS::ENGINE::AtomAny::New(valIn + 1);
+    _pool->pushInSample(_iter, val);
+  }
 }
 
-//! Optional method to initialize the algorithm.
 /*!
- *  For now, the parameter input is always NULL. It might be used in the future to
- *  initialize an algorithm with custom data.
+ *  Optional method called when the algorithm has finished, successfully or
+ *  not, to perform any necessary clean up.
  */
-void OptimizerAlgSyncExample::initialize(const Any *input) throw (YACS::Exception)
+void OptimizerAlgSyncExample::finish()
 {
+  std::cout << "Algo finish" << std::endl;
+  _pool->destroyAll();
 }
 
 /*!
- *  Optional method called when the algorithm has finished, successfully or not, to
- *  perform any necessary clean up.
+ *  Return the value of the algoResult port.
  */
-void OptimizerAlgSyncExample::finish()
+YACS::ENGINE::Any * OptimizerAlgSyncExample::getAlgoResult()
 {
+  YACS::ENGINE::Any *val=YACS::ENGINE::AtomAny::New(42);
+  return val;
 }
 
 //! Factory method to create the algorithm.
-OptimizerAlgBase * createOptimizerAlgSyncExample(Pool *pool)
+YACS::ENGINE::OptimizerAlgBase * createOptimizerAlgSyncExample(YACS::ENGINE::Pool *pool)
 {
   return new OptimizerAlgSyncExample(pool);
-}
+}
\ No newline at end of file
index c371890f8aa1dee6d15712406afb92ddcc1e433f..430820e5c0a3fa5fba56b87737de19c786919b99 100644 (file)
@@ -25,44 +25,77 @@ class myalgoasync(SALOMERuntime.OptimizerAlgASync):
     r=SALOMERuntime.getSALOMERuntime()
     self.tin=r.getTypeCode("double")
     self.tout=r.getTypeCode("int")
+    self.tAlgoInit=r.getTypeCode("int")
+    self.tAlgoResult=r.getTypeCode("int")
 
   def setPool(self,pool):
     """Must be implemented to set the pool"""
     self.pool=pool
 
   def getTCForIn(self):
-    """returns typecode of type expected as Input"""
+    """return typecode of type expected as Input of the internal node """
     return self.tin
 
   def getTCForOut(self):
-    """returns typecode of type expected as Output"""
+    """return typecode of type expected as Output of the internal node"""
     return self.tout
 
-  def startToTakeDecision(self):
-    """This method is called only once to launch the algorithm. It must first fill the
-       pool with samples to evaluate and call self.signalMasterAndWait() to block until a
-       sample has been evaluated. When returning from this method, it MUST check for an
-       eventual termination request (with the method self.isTerminationRequested()). If
-       the termination is requested, the method must perform any necessary cleanup and
-       return as soon as possible. Otherwise it can either add new samples to evaluate in
-       the pool, do nothing (wait for more samples), or empty the pool and return to
-       finish the evaluation.
+  def getTCForAlgoInit(self):
+    """return typecode of type expected as input for initialize """
+    return self.tAlgoInit
+
+  def getTCForAlgoResult(self):
+    """return typecode of type expected as output of the algorithm """
+    return self.tAlgoResult
+
+  def initialize(self,input):
+    """Optional method called on initialization.
+       The type of "input" is returned by "getTCForAlgoInit"
     """
-    val=1.2
-    for iter in xrange(5):
-      #push a sample in the input of the slave node
-      self.pool.pushInSample(iter,val)
-      #wait until next sample is ready
-      self.signalMasterAndWait()
-      #check error notification
-      if self.isTerminationRequested():
-        self.pool.destroyAll()
-        return
+    print "Algo initialize, input = ", input.getIntValue()
 
-      #get a sample from the output of the slave node
+  def startToTakeDecision(self):
+    """This method is called only once to launch the algorithm. It must
+       first fill the pool with samples to evaluate and call
+       self.signalMasterAndWait() to block until a sample has been
+       evaluated. When returning from this method, it MUST check for an
+       eventual termination request (with the method
+       self.isTerminationRequested()). If the termination is requested, the
+       method must perform any necessary cleanup and return as soon as
+       possible. Otherwise it can either add new samples to evaluate in the
+       pool, do nothing (wait for more samples), or empty the pool and
+       return to finish the evaluation.
+    """
+    print "startToTakeDecision"
+    # fill the pool with samples
+    iter=0
+    self.pool.pushInSample(0, 0.5)
+    
+    # 
+    self.signalMasterAndWait()
+    while not self.isTerminationRequested():
       currentId=self.pool.getCurrentId()
-      v=self.pool.getCurrentOutSample()
-      val=val+v.getIntValue()
+      valIn = self.pool.getCurrentInSample().getDoubleValue()
+      valOut = self.pool.getCurrentOutSample().getIntValue()
+      print "Compute currentId=%s, valIn=%s, valOut=%s" % (currentId, valIn, valOut)
+      iter=iter+1
+      
+      if iter < 3:
+        nextSample = valIn + 1
+        self.pool.pushInSample(iter, nextSample)
+        
+      self.signalMasterAndWait()
 
-    #in the end destroy the pool content
+  def finish(self):
+    """Optional method called when the algorithm has finished, successfully
+       or not, to perform any necessary clean up."""
+    print "Algo finish"
     self.pool.destroyAll()
+
+  def getAlgoResult(self):
+    """return the result of the algorithm.
+       The object returned is of type indicated by getTCForAlgoResult.
+    """
+    return 42
+
+
index 1ccf6bda4a4fc7fe25382c1ffbaea9c37e22a2dd..d40a937646c318ca068b1d0e8d95090ef0e3c1d9 100644 (file)
@@ -25,49 +25,68 @@ class myalgosync(SALOMERuntime.OptimizerAlgSync):
     r=SALOMERuntime.getSALOMERuntime()
     self.tin=r.getTypeCode("double")
     self.tout=r.getTypeCode("int")
+    self.tAlgoInit=r.getTypeCode("int")
+    self.tAlgoResult=r.getTypeCode("int")
 
   def setPool(self,pool):
     """Must be implemented to set the pool"""
     self.pool=pool
 
   def getTCForIn(self):
-    """returns typecode of type expected as Input"""
+    """return typecode of type expected as Input of the internal node """
     return self.tin
 
   def getTCForOut(self):
-    """returns typecode of type expected as Output"""
+    """return typecode of type expected as Output of the internal node"""
     return self.tout
 
+  def getTCForAlgoInit(self):
+    """return typecode of type expected as input for initialize """
+    return self.tAlgoInit
+
+  def getTCForAlgoResult(self):
+    """return typecode of type expected as output of the algorithm """
+    return self.tAlgoResult
+
   def initialize(self,input):
-    """Optional method called on initialization. Do nothing here"""
+    """Optional method called on initialization.
+       The type of "input" is returned by "getTCForAlgoInit"
+    """
+    print "Algo initialize, input = ", input.getIntValue()
 
   def start(self):
     """Start to fill the pool with samples to evaluate."""
+    print "Algo start "
     self.iter=0
-    self.pool.pushInSample(4,1.2)
-    self.pool.pushInSample(9,3.4)
+    # pushInSample(id, value)
+    self.pool.pushInSample(self.iter, 0.5)
 
   def takeDecision(self):
-    """ This method is called each time a sample has been evaluated. It can either add
-        new samples to evaluate in the pool, do nothing (wait for more samples), or empty
-        the pool to finish the evaluation.
+    """ This method is called each time a sample has been evaluated. It can
+        either add new samples to evaluate in the pool, do nothing (wait for
+        more samples), or empty the pool to finish the evaluation.
     """
     currentId=self.pool.getCurrentId()
+    valIn = self.pool.getCurrentInSample().getDoubleValue()
+    valOut = self.pool.getCurrentOutSample().getIntValue()
+    print "Algo takeDecision currentId=%s, valIn=%s, valOut=%s" % (currentId, valIn, valOut)
 
-    if self.iter==1:
-      self.pool.pushInSample(16,5.6)
-      self.pool.pushInSample(25,7.8)
-      self.pool.pushInSample(36,9.)
-      self.pool.pushInSample(49,12.3)
-    elif self.iter==4:
-      self.pool.pushInSample(64,45.6)
-      self.pool.pushInSample(81,78.9)
-    else:
-      val=self.pool.getCurrentInSample()
-      if abs(val.getDoubleValue()-45.6) < 1.e-12:
-        self.pool.destroyAll()
     self.iter=self.iter+1
+    if self.iter < 3:
+      # continue
+      nextSample = valIn + 1
+      self.pool.pushInSample(self.iter, nextSample)
 
   def finish(self):
-    """Optional method called when the algorithm has finished, successfully or not, to
-       perform any necessary clean up. Do nothing here"""
+    """Optional method called when the algorithm has finished, successfully
+       or not, to perform any necessary clean up."""
+    print "Algo finish"
+    self.pool.destroyAll()
+
+  def getAlgoResult(self):
+    """return the result of the algorithm.
+       The object returned is of type indicated by getTCForAlgoResult.
+    """
+    return 42
+
+
index 223f38e062c0f92ccf81c60101a834ff34e643ba..bf69320138f3d3a6cdd476694f5acf23b488ec79 100644 (file)
    <objref name="file" id="file"/>
    <type name="int" kind="int"/>
    <sequence name="intvec" content="int"/>
+   <struct name="stringpair">
+      <member name="name" type="string"/>
+      <member name="value" type="string"/>
+   </struct>
+   <sequence name="propvec" content="stringpair"/>
    <objref name="pyobj" id="python:obj:1.0"/>
+   <sequence name="seqboolvec" content="boolvec"/>
+   <sequence name="seqdblevec" content="dblevec"/>
+   <sequence name="seqintvec" content="intvec"/>
    <sequence name="stringvec" content="string"/>
+   <sequence name="seqstringvec" content="stringvec"/>
    <container name="DefaultContainer">
       <property name="container_name" value="FactoryServer"/>
       <property name="name" value="localhost"/>
    </container>
-   <optimizer name="OptimizerLoop0" nbranch="4" lib="libTestOptLoop" entry="createOptimizerAlgASyncExample">
-      <inline name="PyFunction1">
-         <function name="myfunc">
-            <code><![CDATA[def myfunc(inValue):
-    outValue = int(3*inValue+5)
-    print "Received", inValue, ", returning", outValue
-    return outValue
-]]></code>
-         </function>
-         <inport name="inValue" type="double"/>
-         <outport name="outValue" type="int"/>
+   <optimizer name="OptimizerLoop1" nbranch="1" lib="libTestOptLoop" entry="createOptimizerAlgASyncExample">
+      <inline name="PyScript7">
+         <script><code><![CDATA[o9 = int(i8)
+print "traitement:", i8
+]]></code></script>
+         <load container="DefaultContainer"/>
+         <inport name="i8" type="double"/>
+         <outport name="o9" type="int"/>
       </inline>
    </optimizer>
+   <datanode name="DataIn3">
+      <parameter name="o4" type="int">
+         <value><int>5</int></value>
+      </parameter>
+   </datanode>
+   <outnode name="OutNode5">
+      <parameter name="i6" type="int"/>
+   </outnode>
+   <control> <fromnode>OptimizerLoop1</fromnode> <tonode>OutNode5</tonode> </control>
+   <control> <fromnode>DataIn3</fromnode> <tonode>OptimizerLoop1</tonode> </control>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>algoResults</fromport>
+      <tonode>OutNode5</tonode> <toport>i6</toport>
+   </datalink>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>evalSamples</fromport>
+      <tonode>OptimizerLoop1.PyScript7</tonode> <toport>i8</toport>
+   </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0</fromnode> <fromport>evalSamples</fromport>
-      <tonode>OptimizerLoop0.PyFunction1</tonode> <toport>inValue</toport>
+      <fromnode>DataIn3</fromnode> <fromport>o4</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>algoInit</toport>
    </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0.PyFunction1</fromnode> <fromport>outValue</fromport>
-      <tonode>OptimizerLoop0</tonode> <toport>evalResults</toport>
+      <fromnode>OptimizerLoop1.PyScript7</fromnode> <fromport>o9</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>evalResults</toport>
    </datalink>
    <parameter>
-      <tonode>OptimizerLoop0</tonode><toport>nbBranches</toport>
-      <value><int>4</int></value>
+      <tonode>OptimizerLoop1</tonode><toport>nbBranches</toport>
+      <value><int>1</int></value>
    </parameter>
-   <presentation name="OptimizerLoop0" x="6" y="34" width="168" height="178.5" expanded="1" expx="6" expy="34" expWidth="168" expHeight="178.5" shownState="0"/>
-   <presentation name="OptimizerLoop0.PyFunction1" x="6" y="111.5" width="158" height="63" expanded="1" expx="6" expy="111.5" expWidth="158" expHeight="63" shownState="0"/>
-   <presentation name="__ROOT__" x="0" y="0" width="178" height="216.5" expanded="1" expx="0" expy="0" expWidth="178" expHeight="216.5" shownState="0"/>
+   <presentation name="DataIn3" x="11" y="86" width="158" height="63" expanded="1" expx="11" expy="86" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1" x="238.5" y="83.5" width="204.5" height="216" expanded="1" expx="238.5" expy="83.5" expWidth="204.5" expHeight="216" shownState="0"/>
+   <presentation name="OutNode5" x="488.5" y="84" width="158" height="63" expanded="1" expx="488.5" expy="84" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1.PyScript7" x="42.5" y="149" width="158" height="63" expanded="1" expx="42.5" expy="149" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="__ROOT__" x="0" y="0" width="650.5" height="303.5" expanded="1" expx="0" expy="0" expWidth="650.5" expHeight="303.5" shownState="0"/>
 </proc>
index de8ba04800febd96f42d31fdaf4d0811864551d1..115bb6824e8e9320a1bc3ed2ba0e46f00ca1b49e 100644 (file)
    <objref name="file" id="file"/>
    <type name="int" kind="int"/>
    <sequence name="intvec" content="int"/>
+   <struct name="stringpair">
+      <member name="name" type="string"/>
+      <member name="value" type="string"/>
+   </struct>
+   <sequence name="propvec" content="stringpair"/>
    <objref name="pyobj" id="python:obj:1.0"/>
+   <sequence name="seqboolvec" content="boolvec"/>
+   <sequence name="seqdblevec" content="dblevec"/>
+   <sequence name="seqintvec" content="intvec"/>
    <sequence name="stringvec" content="string"/>
+   <sequence name="seqstringvec" content="stringvec"/>
    <container name="DefaultContainer">
       <property name="container_name" value="FactoryServer"/>
       <property name="name" value="localhost"/>
    </container>
-   <optimizer name="OptimizerLoop0" nbranch="4" lib="algoasyncexample.py" entry="myalgoasync">
-      <inline name="PyFunction0">
-         <function name="myfunc">
-            <code><![CDATA[def myfunc(inputValue):
-    outputValue = int(inputValue*3+5)
-    print "Received", inputValue, ", returning", outputValue
-    return outputValue
-]]></code>
-         </function>
-         <inport name="inputValue" type="double"/>
-         <outport name="outputValue" type="int"/>
+   <optimizer name="OptimizerLoop1" nbranch="1" lib="algoasyncexample.py" entry="myalgoasync">
+      <inline name="PyScript7">
+         <script><code><![CDATA[o9 = int(i8)
+print "traitement:", i8
+]]></code></script>
+         <load container="DefaultContainer"/>
+         <inport name="i8" type="double"/>
+         <outport name="o9" type="int"/>
       </inline>
    </optimizer>
+   <datanode name="DataIn3">
+      <parameter name="o4" type="int">
+         <value><int>5</int></value>
+      </parameter>
+   </datanode>
+   <outnode name="OutNode5">
+      <parameter name="i6" type="int"/>
+   </outnode>
+   <control> <fromnode>OptimizerLoop1</fromnode> <tonode>OutNode5</tonode> </control>
+   <control> <fromnode>DataIn3</fromnode> <tonode>OptimizerLoop1</tonode> </control>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>algoResults</fromport>
+      <tonode>OutNode5</tonode> <toport>i6</toport>
+   </datalink>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>evalSamples</fromport>
+      <tonode>OptimizerLoop1.PyScript7</tonode> <toport>i8</toport>
+   </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0</fromnode> <fromport>evalSamples</fromport>
-      <tonode>OptimizerLoop0.PyFunction0</tonode> <toport>inputValue</toport>
+      <fromnode>DataIn3</fromnode> <fromport>o4</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>algoInit</toport>
    </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0.PyFunction0</fromnode> <fromport>outputValue</fromport>
-      <tonode>OptimizerLoop0</tonode> <toport>evalResults</toport>
+      <fromnode>OptimizerLoop1.PyScript7</fromnode> <fromport>o9</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>evalResults</toport>
    </datalink>
    <parameter>
-      <tonode>OptimizerLoop0</tonode><toport>nbBranches</toport>
-      <value><int>4</int></value>
+      <tonode>OptimizerLoop1</tonode><toport>nbBranches</toport>
+      <value><int>1</int></value>
    </parameter>
-   <presentation name="OptimizerLoop0" x="6" y="34" width="167" height="191" expanded="1" expx="6" expy="34" expWidth="167" expHeight="191" shownState="0"/>
-   <presentation name="OptimizerLoop0.PyFunction0" x="5" y="124" width="158" height="63" expanded="1" expx="5" expy="124" expWidth="158" expHeight="63" shownState="0"/>
-   <presentation name="__ROOT__" x="0" y="0" width="177" height="229" expanded="1" expx="0" expy="0" expWidth="177" expHeight="229" shownState="0"/>
+   <presentation name="DataIn3" x="11" y="86" width="158" height="63" expanded="1" expx="11" expy="86" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1" x="238.5" y="83.5" width="204.5" height="216" expanded="1" expx="238.5" expy="83.5" expWidth="204.5" expHeight="216" shownState="0"/>
+   <presentation name="OutNode5" x="488.5" y="84" width="158" height="63" expanded="1" expx="488.5" expy="84" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1.PyScript7" x="42.5" y="149" width="158" height="63" expanded="1" expx="42.5" expy="149" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="__ROOT__" x="0" y="0" width="650.5" height="303.5" expanded="1" expx="0" expy="0" expWidth="650.5" expHeight="303.5" shownState="0"/>
 </proc>
index 97394e915ddf5ece77a27be8a501b07e960639e4..59b78017e189ea31efa6f4cb96d8f05a06468d6f 100644 (file)
    <objref name="file" id="file"/>
    <type name="int" kind="int"/>
    <sequence name="intvec" content="int"/>
+   <struct name="stringpair">
+      <member name="name" type="string"/>
+      <member name="value" type="string"/>
+   </struct>
+   <sequence name="propvec" content="stringpair"/>
    <objref name="pyobj" id="python:obj:1.0"/>
+   <sequence name="seqboolvec" content="boolvec"/>
+   <sequence name="seqdblevec" content="dblevec"/>
+   <sequence name="seqintvec" content="intvec"/>
    <sequence name="stringvec" content="string"/>
+   <sequence name="seqstringvec" content="stringvec"/>
    <container name="DefaultContainer">
       <property name="container_name" value="FactoryServer"/>
       <property name="name" value="localhost"/>
    </container>
-   <optimizer name="OptimizerLoop0" nbranch="4" lib="libTestOptLoop" entry="createOptimizerAlgSyncExample">
-      <inline name="PyFunction1">
-         <function name="myfunc">
-            <code><![CDATA[def myfunc(inValue):
-    outValue = int(3*inValue+5)
-    print "Received", inValue, ", returning", outValue
-    return outValue
-]]></code>
-         </function>
-         <inport name="inValue" type="double"/>
-         <outport name="outValue" type="int"/>
+   <optimizer name="OptimizerLoop1" nbranch="1" lib="libTestOptLoop" entry="createOptimizerAlgSyncExample">
+      <inline name="PyScript7">
+         <script><code><![CDATA[o9 = int(i8)
+print "traitement:", i8
+]]></code></script>
+         <load container="DefaultContainer"/>
+         <inport name="i8" type="double"/>
+         <outport name="o9" type="int"/>
       </inline>
    </optimizer>
+   <datanode name="DataIn3">
+      <parameter name="o4" type="int">
+         <value><int>5</int></value>
+      </parameter>
+   </datanode>
+   <outnode name="OutNode5">
+      <parameter name="i6" type="int"/>
+   </outnode>
+   <control> <fromnode>OptimizerLoop1</fromnode> <tonode>OutNode5</tonode> </control>
+   <control> <fromnode>DataIn3</fromnode> <tonode>OptimizerLoop1</tonode> </control>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>algoResults</fromport>
+      <tonode>OutNode5</tonode> <toport>i6</toport>
+   </datalink>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>evalSamples</fromport>
+      <tonode>OptimizerLoop1.PyScript7</tonode> <toport>i8</toport>
+   </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0</fromnode> <fromport>evalSamples</fromport>
-      <tonode>OptimizerLoop0.PyFunction1</tonode> <toport>inValue</toport>
+      <fromnode>DataIn3</fromnode> <fromport>o4</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>algoInit</toport>
    </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0.PyFunction1</fromnode> <fromport>outValue</fromport>
-      <tonode>OptimizerLoop0</tonode> <toport>evalResults</toport>
+      <fromnode>OptimizerLoop1.PyScript7</fromnode> <fromport>o9</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>evalResults</toport>
    </datalink>
    <parameter>
-      <tonode>OptimizerLoop0</tonode><toport>nbBranches</toport>
-      <value><int>4</int></value>
+      <tonode>OptimizerLoop1</tonode><toport>nbBranches</toport>
+      <value><int>1</int></value>
    </parameter>
-   <presentation name="OptimizerLoop0" x="6" y="34" width="169" height="187.5" expanded="1" expx="6" expy="34" expWidth="169" expHeight="187.5" shownState="0"/>
-   <presentation name="OptimizerLoop0.PyFunction1" x="7" y="120.5" width="158" height="63" expanded="1" expx="7" expy="120.5" expWidth="158" expHeight="63" shownState="0"/>
-   <presentation name="__ROOT__" x="0" y="0" width="179" height="225.5" expanded="1" expx="0" expy="0" expWidth="179" expHeight="225.5" shownState="0"/>
+   <presentation name="DataIn3" x="11" y="86" width="158" height="63" expanded="1" expx="11" expy="86" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1" x="238.5" y="83.5" width="204.5" height="216" expanded="1" expx="238.5" expy="83.5" expWidth="204.5" expHeight="216" shownState="0"/>
+   <presentation name="OutNode5" x="488.5" y="84" width="158" height="63" expanded="1" expx="488.5" expy="84" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1.PyScript7" x="42.5" y="149" width="158" height="63" expanded="1" expx="42.5" expy="149" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="__ROOT__" x="0" y="0" width="650.5" height="303.5" expanded="1" expx="0" expy="0" expWidth="650.5" expHeight="303.5" shownState="0"/>
 </proc>
index 3da9d59c6589ec4708d120cdbe4588ce62a7f815..0b69be3fcbe0cf6d666e569c501f206b90ae438c 100644 (file)
    <objref name="file" id="file"/>
    <type name="int" kind="int"/>
    <sequence name="intvec" content="int"/>
+   <struct name="stringpair">
+      <member name="name" type="string"/>
+      <member name="value" type="string"/>
+   </struct>
+   <sequence name="propvec" content="stringpair"/>
    <objref name="pyobj" id="python:obj:1.0"/>
+   <sequence name="seqboolvec" content="boolvec"/>
+   <sequence name="seqdblevec" content="dblevec"/>
+   <sequence name="seqintvec" content="intvec"/>
    <sequence name="stringvec" content="string"/>
+   <sequence name="seqstringvec" content="stringvec"/>
    <container name="DefaultContainer">
       <property name="container_name" value="FactoryServer"/>
       <property name="name" value="localhost"/>
    </container>
-   <optimizer name="OptimizerLoop0" nbranch="4" lib="algosyncexample.py" entry="myalgosync">
-      <inline name="PyFunction0">
-         <function name="myfunc">
-            <code><![CDATA[def myfunc(inputValue):
-    outputValue = int(inputValue*3+5)
-    print "Received", inputValue, ", returning", outputValue
-    return outputValue
-]]></code>
-         </function>
-         <inport name="inputValue" type="double"/>
-         <outport name="outputValue" type="int"/>
+   <optimizer name="OptimizerLoop1" nbranch="1" lib="algosyncexample.py" entry="myalgosync">
+      <inline name="PyScript7">
+         <script><code><![CDATA[o9 = int(i8)
+print "traitement:", i8
+]]></code></script>
+         <load container="DefaultContainer"/>
+         <inport name="i8" type="double"/>
+         <outport name="o9" type="int"/>
       </inline>
    </optimizer>
+   <datanode name="DataIn3">
+      <parameter name="o4" type="int">
+         <value><int>5</int></value>
+      </parameter>
+   </datanode>
+   <outnode name="OutNode5">
+      <parameter name="i6" type="int"/>
+   </outnode>
+   <control> <fromnode>OptimizerLoop1</fromnode> <tonode>OutNode5</tonode> </control>
+   <control> <fromnode>DataIn3</fromnode> <tonode>OptimizerLoop1</tonode> </control>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>algoResults</fromport>
+      <tonode>OutNode5</tonode> <toport>i6</toport>
+   </datalink>
+   <datalink control="false">
+      <fromnode>OptimizerLoop1</fromnode> <fromport>evalSamples</fromport>
+      <tonode>OptimizerLoop1.PyScript7</tonode> <toport>i8</toport>
+   </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0</fromnode> <fromport>evalSamples</fromport>
-      <tonode>OptimizerLoop0.PyFunction0</tonode> <toport>inputValue</toport>
+      <fromnode>DataIn3</fromnode> <fromport>o4</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>algoInit</toport>
    </datalink>
    <datalink control="false">
-      <fromnode>OptimizerLoop0.PyFunction0</fromnode> <fromport>outputValue</fromport>
-      <tonode>OptimizerLoop0</tonode> <toport>evalResults</toport>
+      <fromnode>OptimizerLoop1.PyScript7</fromnode> <fromport>o9</fromport>
+      <tonode>OptimizerLoop1</tonode> <toport>evalResults</toport>
    </datalink>
    <parameter>
-      <tonode>OptimizerLoop0</tonode><toport>nbBranches</toport>
-      <value><int>4</int></value>
+      <tonode>OptimizerLoop1</tonode><toport>nbBranches</toport>
+      <value><int>1</int></value>
    </parameter>
-   <presentation name="OptimizerLoop0.PyFunction0" x="6" y="111.5" width="158" height="63" expanded="1" expx="6" expy="111.5" expWidth="158" expHeight="63" shownState="0"/>
-   <presentation name="OptimizerLoop0" x="6" y="34" width="168" height="178.5" expanded="1" expx="6" expy="34" expWidth="168" expHeight="178.5" shownState="0"/>
-   <presentation name="__ROOT__" x="0" y="0" width="178" height="216.5" expanded="1" expx="0" expy="0" expWidth="178" expHeight="216.5" shownState="0"/>
+   <presentation name="DataIn3" x="11" y="86" width="158" height="63" expanded="1" expx="11" expy="86" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1" x="238.5" y="83.5" width="204.5" height="216" expanded="1" expx="238.5" expy="83.5" expWidth="204.5" expHeight="216" shownState="0"/>
+   <presentation name="OutNode5" x="488.5" y="84" width="158" height="63" expanded="1" expx="488.5" expy="84" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="OptimizerLoop1.PyScript7" x="42.5" y="149" width="158" height="63" expanded="1" expx="42.5" expy="149" expWidth="158" expHeight="63" shownState="0"/>
+   <presentation name="__ROOT__" x="0" y="0" width="650.5" height="303.5" expanded="1" expx="0" expy="0" expWidth="650.5" expHeight="303.5" shownState="0"/>
 </proc>