PIVector reshape and etc...
This commit is contained in:
@@ -233,6 +233,13 @@ public:
|
|||||||
elementNew(piv_data + i, f);
|
elementNew(piv_data + i, f);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
inline PIVector<T> & fill(std::function<T(size_t)> f) {
|
||||||
|
deleteT(piv_data, piv_size);
|
||||||
|
PIINTROSPECTION_CONTAINER_USED(T, piv_size)
|
||||||
|
for (size_t i = 0; i < piv_size; ++i)
|
||||||
|
elementNew(piv_data + i, f(i));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
inline PIVector<T> & assign(const T & f = T()) {return fill(f);}
|
inline PIVector<T> & assign(const T & f = T()) {return fill(f);}
|
||||||
template<typename T1 = T, typename std::enable_if<
|
template<typename T1 = T, typename std::enable_if<
|
||||||
!std::is_trivially_copyable<T1>::value
|
!std::is_trivially_copyable<T1>::value
|
||||||
@@ -264,6 +271,21 @@ public:
|
|||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
inline PIVector<T> & resize(size_t new_size, std::function<T(size_t)> f) {
|
||||||
|
if (new_size < piv_size) {
|
||||||
|
T * de = &(piv_data[new_size]);
|
||||||
|
deleteT(de, piv_size - new_size);
|
||||||
|
piv_size = new_size;
|
||||||
|
}
|
||||||
|
if (new_size > piv_size) {
|
||||||
|
size_t os = piv_size;
|
||||||
|
alloc(new_size);
|
||||||
|
PIINTROSPECTION_CONTAINER_USED(T, (new_size-os))
|
||||||
|
for (size_t i = os; i < new_size; ++i)
|
||||||
|
elementNew(piv_data + i, f(i));
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
template<typename T1 = T, typename std::enable_if<
|
template<typename T1 = T, typename std::enable_if<
|
||||||
std::is_trivially_copyable<T1>::value
|
std::is_trivially_copyable<T1>::value
|
||||||
, int>::type = 0>
|
, int>::type = 0>
|
||||||
@@ -448,6 +470,33 @@ public:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline PIVector<PIVector<T>> reshape(size_t rows, size_t cols) const {
|
||||||
|
assert(rows*cols == piv_size);
|
||||||
|
PIVector<PIVector<T>> ret;
|
||||||
|
ret.resize(rows);
|
||||||
|
for (size_t i = 0; i < rows; i++) {
|
||||||
|
ret[i] = PIVector<T>(&(piv_data[i*cols]), cols);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename C, typename std::enable_if<
|
||||||
|
std::is_same<T, PIVector<C>>::value
|
||||||
|
, int>::type = 0>
|
||||||
|
inline PIVector<C> reshape() const {
|
||||||
|
PIVector<C> ret;
|
||||||
|
size_t rows = size();
|
||||||
|
if (rows) {
|
||||||
|
size_t cols = at(0).size();
|
||||||
|
ret.reserve(rows * cols);
|
||||||
|
for (size_t i = 0; i < rows; i++) {
|
||||||
|
ret.append(at(i));
|
||||||
|
}
|
||||||
|
ret.resize(rows * cols);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
inline void _reset() {piv_size = piv_rsize = 0; piv_data = 0;}
|
inline void _reset() {piv_size = piv_rsize = 0; piv_data = 0;}
|
||||||
inline size_t asize(size_t s) {
|
inline size_t asize(size_t s) {
|
||||||
|
|||||||
@@ -50,10 +50,11 @@ public:
|
|||||||
inline PIVector2D(size_t rows, size_t cols, PIVector<T> && v) : rows_(rows), cols_(cols), mat(std::move(v)) {
|
inline PIVector2D(size_t rows, size_t cols, PIVector<T> && v) : rows_(rows), cols_(cols), mat(std::move(v)) {
|
||||||
mat.resize(rows*cols);
|
mat.resize(rows*cols);
|
||||||
}
|
}
|
||||||
inline PIVector2D(const PIVector<PIVector<T> > & v) {
|
inline PIVector2D(const PIVector<PIVector<T>> & v) {
|
||||||
rows_ = v.size();
|
rows_ = v.size();
|
||||||
if (rows_) {
|
if (rows_) {
|
||||||
cols_ = v[0].size();
|
cols_ = v[0].size();
|
||||||
|
mat.reserve(rows_*cols_);
|
||||||
for (size_t i = 0; i < rows_; i++) {
|
for (size_t i = 0; i < rows_; i++) {
|
||||||
mat.append(v[i]);
|
mat.append(v[i]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -260,6 +260,7 @@ class PIP_EXPORT PIMathVector {
|
|||||||
public:
|
public:
|
||||||
PIMathVector(const uint size = 0, const Type & new_value = Type()) {c.resize(size, new_value);}
|
PIMathVector(const uint size = 0, const Type & new_value = Type()) {c.resize(size, new_value);}
|
||||||
PIMathVector(const PIVector<Type> & val) {c = val;}
|
PIMathVector(const PIVector<Type> & val) {c = val;}
|
||||||
|
PIMathVector(PIVector<Type> && val) : c(std::move(val)) {}
|
||||||
PIMathVector(std::initializer_list<Type> init_list) {c = PIVector<Type>(init_list);}
|
PIMathVector(std::initializer_list<Type> init_list) {c = PIVector<Type>(init_list);}
|
||||||
|
|
||||||
template<uint Size>
|
template<uint Size>
|
||||||
@@ -271,6 +272,14 @@ public:
|
|||||||
for (uint i = 0; i < v.size(); ++i) v.c[i] = fn[i] - st[i];
|
for (uint i = 0; i < v.size(); ++i) v.c[i] = fn[i] - st[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PIMathVector zeros(const uint size) {return PIMathVector(size, Type());}
|
||||||
|
static PIMathVector ones(const uint size) {return PIMathVector(size, Type(1));}
|
||||||
|
static PIMathVector arange(const Type start, const Type stop, const Type step = Type(1)) {
|
||||||
|
PIVector<Type> v;
|
||||||
|
for (Type i = start; i < stop; i+= step) v << i;
|
||||||
|
return PIMathVector(std::move(v));
|
||||||
|
}
|
||||||
|
|
||||||
uint size() const {return c.size();}
|
uint size() const {return c.size();}
|
||||||
_CVector & resize(uint size, const Type & new_value = Type()) {
|
_CVector & resize(uint size, const Type & new_value = Type()) {
|
||||||
c.resize(size, new_value);
|
c.resize(size, new_value);
|
||||||
|
|||||||
249
main.cpp
249
main.cpp
@@ -1,241 +1,22 @@
|
|||||||
#include "pip.h"
|
#include "pip.h"
|
||||||
|
|
||||||
|
|
||||||
PIPeer p0("p0"), p1("p1");
|
template <typename S, typename T, typename std::enable_if<
|
||||||
|
std::is_same<T, PIVector<S>>::value
|
||||||
|
, int>::type = 0> PIVector<S> rrr(PIVector<T>) {
|
||||||
|
piCout << std::is_same<T, PIVector<S>>::value;
|
||||||
|
return PIVector<S>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
PIVector<int> x;
|
||||||
PIMap<uint, int> sends, recs;
|
x.resize(16, [](size_t i) {return i+1;});
|
||||||
PISet<uint> errors, missed;
|
piCout << x;
|
||||||
|
PIVector<PIVector<int>> m = x.reshape(4,4);
|
||||||
CONNECTL(&p0, dataReceivedEvent, ([&](const PIString & from, const PIByteArray & data){
|
piCout << m;
|
||||||
uint cnt = *(uint*)(data.data());
|
PIVector<int> y;
|
||||||
piCout << "rec " << cnt << data.size_s();
|
y = m.reshape<int>();
|
||||||
recs[cnt] = data.size_s();
|
piCout << y;
|
||||||
if (sends[cnt] != data.size_s()) {
|
|
||||||
piCout << " " << cnt << "ERROR";
|
|
||||||
errors << cnt;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
p0.start();
|
|
||||||
p1.start();
|
|
||||||
|
|
||||||
piSleep(2);
|
|
||||||
|
|
||||||
int count = 10;
|
|
||||||
for (int i = 0; i < count; ++i) {
|
|
||||||
PIByteArray msg;
|
|
||||||
msg << (uint)i;
|
|
||||||
msg.enlarge(randomi() % 3800 + 4000);
|
|
||||||
sends[i] = msg.size_s();
|
|
||||||
piCout << "send" << i << msg.size_s();
|
|
||||||
p1.send(p0.name(), msg);
|
|
||||||
piMSleep(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
piSleep(1);
|
|
||||||
for (int i = 0; i < count; ++i)
|
|
||||||
if (!recs.contains(i)) missed << i;
|
|
||||||
piCout << "errors" << errors;
|
|
||||||
piCout << "missed" << missed;
|
|
||||||
|
|
||||||
|
|
||||||
/*PIDataTransfer tr0, tr1;
|
|
||||||
CONNECTL(&tr0, receiveFinished, ([&](bool ok){
|
|
||||||
PIByteArray ba = tr0.data();
|
|
||||||
uint cnt = *(uint*)(ba.data());
|
|
||||||
piCout << "rec " << cnt << ok << ba.size_s();
|
|
||||||
}));
|
|
||||||
|
|
||||||
CONNECTL(&tr1, sendRequest, ([&](PIByteArray & data){tr0.received(data);}));
|
|
||||||
CONNECTL(&tr0, sendRequest, ([&](PIByteArray & data){tr1.received(data);}));
|
|
||||||
|
|
||||||
int count = 10;
|
|
||||||
for (int i = 0; i < count; ++i) {
|
|
||||||
PIByteArray msg;
|
|
||||||
msg << (uint)i;
|
|
||||||
msg.enlarge(randomi() % 3800 + 4000);
|
|
||||||
//sends[i] = msg.size_s();
|
|
||||||
piCout << "send" << i << msg.size_s();
|
|
||||||
tr1.send(msg);
|
|
||||||
//piMSleep(100);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
const int iters = 4;
|
|
||||||
const int sz = 10000000;
|
|
||||||
|
|
||||||
|
|
||||||
// {
|
|
||||||
// piCout << "PIVector push back";
|
|
||||||
// PIVector<int> v;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v.push_back(i);
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m() << v.capacity();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "PIVector push front";
|
|
||||||
// PIVector<int> v;
|
|
||||||
// v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v.push_front(i);
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m() << v.capacity();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "PIVector insert center";
|
|
||||||
// PIVector<int> v;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v.insert(v.size()/2, i);
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "PIDeque push back";
|
|
||||||
// PIDeque<int> v;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v.push_back(i);
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m() << v.capacity();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "PIDeque push front";
|
|
||||||
// PIDeque<int> v;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v.push_front(i);
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m() << v.capacity();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "PIDeque insert center";
|
|
||||||
// PIDeque<int> v;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v.insert(v.size()/2, i);
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m() << v.capacity();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
PIVector<llong> ind;
|
|
||||||
for (int i=0; i<sz; ++i) {
|
|
||||||
ind << randomi();
|
|
||||||
}
|
|
||||||
|
|
||||||
piCout << "\n";
|
|
||||||
{
|
|
||||||
piCout << "PIMap insert back";
|
|
||||||
PIMap<llong, int> v;
|
|
||||||
//v.reserve(sz);
|
|
||||||
for (int n=0; n<iters; ++n) {
|
|
||||||
PITimeMeasurer tm;
|
|
||||||
for (int i=0; i<sz; ++i) {
|
|
||||||
v[i] = i;
|
|
||||||
}
|
|
||||||
piCout << tm.elapsed_m();
|
|
||||||
v.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
piCout << "\n";
|
|
||||||
{
|
|
||||||
piCout << "PIMap insert front";
|
|
||||||
PIMap<llong, int> v;
|
|
||||||
//v.reserve(sz);
|
|
||||||
for (int n=0; n<iters; ++n) {
|
|
||||||
PITimeMeasurer tm;
|
|
||||||
for (int i=0; i<sz; ++i) {
|
|
||||||
v[sz - i] = i;
|
|
||||||
}
|
|
||||||
piCout << tm.elapsed_m();
|
|
||||||
v.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
piCout << "\n";
|
|
||||||
{
|
|
||||||
piCout << "PIMap insert random";
|
|
||||||
PIMap<llong, int> v;
|
|
||||||
//v.reserve(sz);
|
|
||||||
for (int n=0; n<iters; ++n) {
|
|
||||||
PITimeMeasurer tm;
|
|
||||||
for (int i=0; i<sz; ++i) {
|
|
||||||
v[ind[i]] = i;
|
|
||||||
}
|
|
||||||
piCout << tm.elapsed_m();
|
|
||||||
v.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "Multi insert";
|
|
||||||
// PIVector<int> v;
|
|
||||||
// PIDeque<int> v2;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) {
|
|
||||||
// v << i;
|
|
||||||
// v2 << v[i];
|
|
||||||
// }
|
|
||||||
// piCout << tm.elapsed_m();
|
|
||||||
// v.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// piCout << "\n";
|
|
||||||
// {
|
|
||||||
// piCout << "Multi insert 2";
|
|
||||||
// PIVector<int> v;
|
|
||||||
// PIDeque<PIPair<int,int>> v2;
|
|
||||||
// //v.reserve(sz);
|
|
||||||
// for (int n=0; n<iters; ++n) {
|
|
||||||
// PITimeMeasurer tm;
|
|
||||||
// for (int i=0; i<sz; ++i) v << i;
|
|
||||||
// for (int i=0; i<sz; ++i) v2 << PIPair<int,int>(i, v[i]);
|
|
||||||
// piCout << tm.elapsed_m();
|
|
||||||
// v.clear();
|
|
||||||
// v2.clear();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,8 +127,8 @@ const DispatcherClient * DispatcherServer::getServer(int index) {
|
|||||||
map_mutex.lock();
|
map_mutex.lock();
|
||||||
if (index >=0 && index < clients.size_s()) {
|
if (index >=0 && index < clients.size_s()) {
|
||||||
tmp = clients[index];
|
tmp = clients[index];
|
||||||
|
if (index_c_servers.contains(tmp)) ret = tmp;
|
||||||
}
|
}
|
||||||
if (index_c_servers.contains(tmp)) ret = tmp;
|
|
||||||
map_mutex.unlock();
|
map_mutex.unlock();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user