Skip to content

Commit

Permalink
[cn] reset interm variables (create_dom -> create_interm_var)
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonRohou committed Aug 25, 2021
1 parent 935b7fc commit ff42f1c
Show file tree
Hide file tree
Showing 22 changed files with 296 additions and 69 deletions.
4 changes: 2 additions & 2 deletions doc/doc/index.rst
Expand Up @@ -182,7 +182,7 @@ The distance function :math:`g(\mathbf{x},\mathbf{b})` between the robot and a l

for i in range (0,len(y)): # we add the observ. constraint for each range-only measurement

p = cn.create_dom(IntervalVector(4)) # intermed. variable (state at t_i)
p = cn.create_interm_var(IntervalVector(4)) # intermed. variable (state at t_i)

# Distance constraint: relation between the state at t_i and the ith beacon position
cn.add(ctc.dist, [cn.subvector(p,0,1), b[i], y[i]])
Expand All @@ -197,7 +197,7 @@ The distance function :math:`g(\mathbf{x},\mathbf{b})` between the robot and a l

for(int i = 0 ; i < 3 ; i++) // we add the observ. constraint for each range-only measurement
{
IntervalVector& p = cn.create_dom(IntervalVector(4)); // intermed. variable (state at t_i)
IntervalVector& p = cn.create_interm_var(IntervalVector(4)); // intermed. variable (state at t_i)

// Distance constraint: relation between the state at t_i and the ith beacon position
cn.add(ctc::dist, {cn.subvector(p,0,1), b[i], y[i]});
Expand Down
8 changes: 4 additions & 4 deletions doc/doc/tutorial/04-own-contractor/index.rst
Expand Up @@ -548,7 +548,7 @@ Appendix
cn.contract(); // segmentation fault here
Instead, we must create the domains inside the CN object in order to keep it alive outside the block. This can be done with the method ``.create_dom()``:
Instead, we must create the domains inside the CN object in order to keep it alive outside the block. This can be done with the method ``.create_interm_var()``:

.. code:: cpp
Expand All @@ -558,7 +558,7 @@ Appendix
if(/* some condition */)
{
Interval& a = cn.create_dom(Interval(1,20));
Interval& a = cn.create_interm_var(Interval(1,20));
cn.add(ctc_plus, {x, y, a});
} // 'a' is not lost
Expand All @@ -568,8 +568,8 @@ Appendix

.. code:: cpp
IntervalVector& d = cn.create_dom(IntervalVector(2));
IntervalVector& d = cn.create_interm_var(IntervalVector(2));
creates for instance an intermediate 2d variable with a 2d box domain: :math:`[\mathbf{d}]=[-\infty,\infty]^2`. Its argument defines the type of domain to be created (``Interval``, ``IntervalVector``, *etc.*).

Technically, ``create_dom()`` returns a C++ *reference* (in the above example, of type ``IntervalVector&``). The reference is an alias on the intermediate variable, that is now inside the Contractor Network. It can be used in the same way as other variables involved in the CN.
Technically, ``create_interm_var()`` returns a C++ *reference* (in the above example, of type ``IntervalVector&``). The reference is an alias on the intermediate variable, that is now inside the Contractor Network. It can be used in the same way as other variables involved in the CN.
6 changes: 3 additions & 3 deletions doc/doc/tutorial/07-data-association/solution.py
Expand Up @@ -103,9 +103,9 @@ def contract(self, x):
y2 = Interval(v_obs[i][2]) # bearing

# Intermediate variables:
a = cn.create_dom(Interval())
d = cn.create_dom(IntervalVector(2))
p = cn.create_dom(IntervalVector(4))
a = cn.create_interm_var(Interval())
d = cn.create_interm_var(IntervalVector(2))
p = cn.create_interm_var(IntervalVector(4))

cn.add(ctc_constell, [m[i]])
cn.add(ctc_minus, [d, m[i], cn.subvector(p,0,1)])
Expand Down
8 changes: 4 additions & 4 deletions examples/brunovsky/main.cpp
Expand Up @@ -109,10 +109,10 @@ int main()
{
// New domains and intermediate variables:
Vector& landmark((i%2 == 0) ? m_a : m_b); // selecting landmark
IntervalVector& b = cn.create_dom(IntervalVector(landmark));
Interval& t = cn.create_dom((i+1)*tdomain.diam()/nb_obs+tdomain.lb());
Interval& d = cn.create_dom(sqrt(sqr(b[0]-x_truth(t)[0])+sqr(b[1]-x_truth(t)[1])));
IntervalVector& p = cn.create_dom(IntervalVector(4)); // state at time t
IntervalVector& b = cn.create_interm_var(IntervalVector(landmark));
Interval& t = cn.create_interm_var((i+1)*tdomain.diam()/nb_obs+tdomain.lb());
Interval& d = cn.create_interm_var(sqrt(sqr(b[0]-x_truth(t)[0])+sqr(b[1]-x_truth(t)[1])));
IntervalVector& p = cn.create_interm_var(IntervalVector(4)); // state at time t

d.inflate(0.025); // bounded measurement
cout << i << "\t" << ((i%2 == 0) ? "m_a" : "m_b") << "\t" << t.mid() << "\t" << d << endl;
Expand Down
6 changes: 3 additions & 3 deletions examples/robotics/10_datasso/datasso.py
Expand Up @@ -98,9 +98,9 @@ def contract(self, x):
y2 = Interval(v_obs[i][2]) # bearing

# Intermediate variables:
a = cn.create_dom(Interval())
d = cn.create_dom(IntervalVector(2))
p = cn.create_dom(IntervalVector(3))
a = cn.create_interm_var(Interval())
d = cn.create_interm_var(IntervalVector(2))
p = cn.create_interm_var(IntervalVector(3))

cn.add(ctc_constell, [m[i]])
cn.add(ctc_minus, [d, m[i], cn.subvector(p,0,1)])
Expand Down
6 changes: 3 additions & 3 deletions examples/robotics/10_datasso/main.cpp
Expand Up @@ -96,9 +96,9 @@ int main()
Interval &y2 = v_obs[i][2]; // bearing

// Intermediate variables:
Interval& a = cn.create_dom(Interval());
IntervalVector& d = cn.create_dom(IntervalVector(2));
IntervalVector& p = cn.create_dom(IntervalVector(3));
Interval& a = cn.create_interm_var(Interval());
IntervalVector& d = cn.create_interm_var(IntervalVector(2));
IntervalVector& p = cn.create_interm_var(IntervalVector(3));

cn.add(ctc_constell, {m[i]});
cn.add(ctc_minus, {d, m[i], cn.subvector(p,0,1)});
Expand Down
2 changes: 1 addition & 1 deletion examples/tuto/01_getting_started/01_getting_started.cpp
Expand Up @@ -65,7 +65,7 @@ int main()

for(int i = 0 ; i < 3 ; i++) // we add the observ. constraint for each range-only measurement
{
IntervalVector& p = cn.create_dom(IntervalVector(4)); // intermed. variable (state at t_i)
IntervalVector& p = cn.create_interm_var(IntervalVector(4)); // intermed. variable (state at t_i)

// Distance constraint: relation between the state at t_i and the ith beacon position
cn.add(ctc::dist, {cn.subvector(p,0,1), b[i], y[i]});
Expand Down
2 changes: 1 addition & 1 deletion examples/tuto/01_getting_started/01_getting_started.py
Expand Up @@ -56,7 +56,7 @@

for i in range (0,len(y)): # we add the observ. constraint for each range-only measurement

p = cn.create_dom(IntervalVector(4)) # intermed. variable (state at t_i)
p = cn.create_interm_var(IntervalVector(4)) # intermed. variable (state at t_i)

# Distance constraint: relation between the state at t_i and the ith beacon position
cn.add(ctc.dist, [cn.subvector(p,0,1), b[i], y[i]])
Expand Down
Expand Up @@ -60,8 +60,8 @@ int main()
for(int i = 0 ; i < v_obs.size() ; i++)
{
// Intermediate variables
Interval& alpha = cn.create_dom(Interval());
IntervalVector& d = cn.create_dom(IntervalVector(2));
Interval& alpha = cn.create_interm_var(Interval());
IntervalVector& d = cn.create_interm_var(IntervalVector(2));

cn.add(ctc_plus, {v_obs[i][1], heading, alpha});
cn.add(ctc_minus, {v_map[i], x, d});
Expand Down
Expand Up @@ -46,8 +46,8 @@
for i in range(0,len(v_obs)):

# Intermediate variables
alpha = cn.create_dom(Interval())
d = cn.create_dom(IntervalVector(2))
alpha = cn.create_interm_var(Interval())
d = cn.create_interm_var(IntervalVector(2))

cn.add(ctc_plus, [v_obs[i][1], heading, alpha])
cn.add(ctc_minus, [v_map[i], x, d])
Expand Down
2 changes: 1 addition & 1 deletion examples/tuto/04_dyn_rangeonly/04_dyn_rangeonly.cpp
Expand Up @@ -64,7 +64,7 @@ int main()

for(int i = 0 ; i < 3 ; i++) // we add the observ. constraint for each range-only measurement
{
IntervalVector& p = cn.create_dom(IntervalVector(4)); // intermed. variable (state at t_i)
IntervalVector& p = cn.create_interm_var(IntervalVector(4)); // intermed. variable (state at t_i)

// Distance constraint: relation between the state at t_i and the ith beacon position
cn.add(ctc::dist, {cn.subvector(p,0,1), b[i], y[i]});
Expand Down
2 changes: 1 addition & 1 deletion examples/tuto/04_dyn_rangeonly/04_dyn_rangeonly.py
Expand Up @@ -56,7 +56,7 @@

for i in range (0,len(y)): # we add the observ. constraint for each range-only measurement

p = cn.create_dom(IntervalVector(4)) # intermed. variable (state at t_i)
p = cn.create_interm_var(IntervalVector(4)) # intermed. variable (state at t_i)

# Distance constraint: relation between the state at t_i and the ith beacon position
cn.add(ctc.dist, [cn.subvector(p,0,1), b[i], y[i]])
Expand Down
6 changes: 3 additions & 3 deletions examples/tuto/05_dyn_rangebearing/05_dyn_rangebearing.cpp
Expand Up @@ -81,9 +81,9 @@ int main()
for(auto& y : v_obs)
{
// Intermediate variables
Interval& alpha = cn.create_dom(Interval()); // absolute angle robot-landmark
IntervalVector& d = cn.create_dom(IntervalVector(2)); // dist robot-landmark
IntervalVector& p = cn.create_dom(IntervalVector(4)); // state at t_i
Interval& alpha = cn.create_interm_var(Interval()); // absolute angle robot-landmark
IntervalVector& d = cn.create_interm_var(IntervalVector(2)); // dist robot-landmark
IntervalVector& p = cn.create_interm_var(IntervalVector(4)); // state at t_i

cn.add(ctc_plus, {y[2], p[2], alpha});
cn.add(ctc_minus, {cn.subvector(y,3,4), cn.subvector(p,0,1), d});
Expand Down
6 changes: 3 additions & 3 deletions examples/tuto/05_dyn_rangebearing/05_dyn_rangebearing.py
Expand Up @@ -66,9 +66,9 @@
for y in v_obs: # we add the observ. constraint for each range-only measurement

# Intermediate variables
alpha = cn.create_dom(Interval()) # absolute angle robot-landmark
d = cn.create_dom(IntervalVector(2)) # dist robot-landmark
p = cn.create_dom(IntervalVector(4)) # state at t_i
alpha = cn.create_interm_var(Interval()) # absolute angle robot-landmark
d = cn.create_interm_var(IntervalVector(2)) # dist robot-landmark
p = cn.create_interm_var(IntervalVector(4)) # state at t_i

cn.add(ctc_plus, [y[2], p[2], alpha])
cn.add(ctc_minus, [cn.subvector(y,3,4), cn.subvector(p,0,1), d])
Expand Down
4 changes: 2 additions & 2 deletions python/codac/tests/test_cn.py
Expand Up @@ -462,7 +462,7 @@ def test_adding_continuous_data(self):
self.assertEqual(v(4), Interval(-3.,-1.))


def test_create_dom_tube(self):
def test_create_interm_var_tube(self):

dt = 0.1
tdomain = Interval(0.,10.)
Expand All @@ -475,7 +475,7 @@ def test_create_dom_tube(self):
ctc_deriv = CtcDeriv()

v_local = Tube(tdomain, dt, TFunction("0"))
#v_inside = cn.create_dom(v_local)
#v_inside = cn.create_interm_var(v_local)
#cn.add(ctc_deriv, [x,v_inside])

#cn.contract()
Expand Down
24 changes: 24 additions & 0 deletions python/src/core/cn/codac_py_ContractorNetwork.cpp
Expand Up @@ -134,6 +134,30 @@ void export_ContractorNetwork(py::module& m)
py::return_value_policy::reference_internal,
py::keep_alive<1,0>())

.def("create_interm_var", (Interval& (ContractorNetwork::*)(const Interval&))&ContractorNetwork::create_interm_var,
CONTRACTORNETWORK_INTERVAL_CREATE_INTERM_VAR_INTERVAL,
"i"_a,
py::return_value_policy::reference_internal,
py::keep_alive<1,0>())

.def("create_interm_var", (IntervalVector& (ContractorNetwork::*)(const IntervalVector&))&ContractorNetwork::create_interm_var,
CONTRACTORNETWORK_INTERVALVECTOR_CREATE_INTERM_VAR_INTERVALVECTOR,
"iv"_a,
py::return_value_policy::reference_internal,
py::keep_alive<1,0>())

.def("create_interm_var", (Tube& (ContractorNetwork::*)(const Tube&))&ContractorNetwork::create_interm_var,
CONTRACTORNETWORK_TUBE_CREATE_INTERM_VAR_TUBE,
"t"_a,
py::return_value_policy::reference_internal,
py::keep_alive<1,0>())

.def("create_interm_var", (TubeVector& (ContractorNetwork::*)(const TubeVector&))&ContractorNetwork::create_interm_var,
CONTRACTORNETWORK_TUBEVECTOR_CREATE_INTERM_VAR_TUBEVECTOR,
"tv"_a,
py::return_value_policy::reference_internal,
py::keep_alive<1,0>())

.def("subvector", (IntervalVector& (ContractorNetwork::*)(Vector&,int,int))&ContractorNetwork::subvector,
CONTRACTORNETWORK_INTERVALVECTOR_SUBVECTOR_VECTOR_INT_INT,
"v"_a, "start_index"_a, "end_index"_a,
Expand Down
32 changes: 28 additions & 4 deletions src/core/cn/codac_ContractorNetwork.cpp
Expand Up @@ -61,22 +61,46 @@ namespace codac

Interval& ContractorNetwork::create_dom(const Interval& i)
{
return add_dom(Domain(i))->interval();
cout << "create_dom(): deprecated. Use create_interm_var() instead." << endl;
return create_interm_var(i);
}

Interval& ContractorNetwork::create_interm_var(const Interval& i)
{
return add_dom(Domain(i, true))->interval();
}

IntervalVector& ContractorNetwork::create_dom(const IntervalVector& iv)
{
return add_dom(Domain(iv))->interval_vector();
cout << "create_dom(): deprecated. Use create_interm_var() instead." << endl;
return create_interm_var(iv);
}

IntervalVector& ContractorNetwork::create_interm_var(const IntervalVector& iv)
{
return add_dom(Domain(iv, true))->interval_vector();
}

Tube& ContractorNetwork::create_dom(const Tube& t)
{
return add_dom(Domain(t))->tube();
cout << "create_dom(): deprecated. Use create_interm_var() instead." << endl;
return create_interm_var(t);
}

Tube& ContractorNetwork::create_interm_var(const Tube& t)
{
return add_dom(Domain(t, true))->tube();
}

TubeVector& ContractorNetwork::create_dom(const TubeVector& tv)
{
return add_dom(Domain(tv))->tube_vector();
cout << "create_dom(): deprecated. Use create_interm_var() instead." << endl;
return create_interm_var(tv);
}

TubeVector& ContractorNetwork::create_interm_var(const TubeVector& tv)
{
return add_dom(Domain(tv, true))->tube_vector();
}

IntervalVector& ContractorNetwork::subvector(Vector& v, int start_index, int end_index)
Expand Down
6 changes: 6 additions & 0 deletions src/core/cn/codac_ContractorNetwork.h
Expand Up @@ -96,6 +96,7 @@ namespace codac
* \return a reference to the created Interval domain variable
*/
Interval& create_dom(const Interval& i);
Interval& create_interm_var(const Interval& i);

/**
* \brief Creates an IntervalVector intermediate variable with a reference kept in the
Expand All @@ -109,6 +110,7 @@ namespace codac
* \return a reference to the created IntervalVector domain variable
*/
IntervalVector& create_dom(const IntervalVector& iv);
IntervalVector& create_interm_var(const IntervalVector& iv);

/**
* \brief Creates a Tube intermediate variable with a reference kept in the
Expand All @@ -122,6 +124,7 @@ namespace codac
* \return a reference to the created Tube domain variable
*/
Tube& create_dom(const Tube& t);
Tube& create_interm_var(const Tube& t);

/**
* \brief Creates a TubeVector intermediate variable with a reference kept in the
Expand All @@ -135,6 +138,7 @@ namespace codac
* \return a reference to the created TubeVector domain variable
*/
TubeVector& create_dom(const TubeVector& tv);
TubeVector& create_interm_var(const TubeVector& tv);

/**
* \brief Creates a subvector of a Vector domain
Expand Down Expand Up @@ -279,6 +283,8 @@ namespace codac
*/
void trigger_all_contractors();

void reset_interm_var();

/**
* \brief Returns the number of contractors that are waiting for process.
*
Expand Down
12 changes: 11 additions & 1 deletion src/core/cn/codac_ContractorNetwork_solve.cpp
Expand Up @@ -158,7 +158,7 @@ namespace codac
for(const auto& ctc : m_map_ctc)
{
if(ctc.second->type() == Contractor::Type::T_IBEX
|| ctc.second->type() == Contractor::Type::T_TUBEX
|| ctc.second->type() == Contractor::Type::T_CODAC
|| ctc.second->type() == Contractor::Type::T_EQUALITY)
{
// Only "contracting" contractors are triggered
Expand All @@ -171,6 +171,16 @@ namespace codac
}
}

void ContractorNetwork::reset_interm_var()
{
for(auto& dom : m_map_domains)
if(dom.second->is_interm_var())
{
dom.second->reset_value();
trigger_ctc_related_to_dom(dom.second);
}
}

int ContractorNetwork::nb_ctc_in_stack() const
{
return m_deque.size();
Expand Down

0 comments on commit ff42f1c

Please sign in to comment.