www.pudn.com > bp_cpp.zip > vec_container.cpp
/* * public/ann/vec_container.cpp * 2004-05-05 by ShanLanshan * * 实现向量容器接口 */ #include "public/ann/vec_container.h" #include "public/ann/vector.h" #include "public/prob.h" #include "public/bit.h" #includenamespace ann { /////////////////////////////////////////////////////////////////// // class AnnVectorContainer /////////////////////////////////////////////////////////////////// AnnVectorContainer::AnnVectorContainer() { m_curr_sample = 0; } bool AnnVectorContainer::add(IAnnVector& vec) { AnnVector *av; IAnnVector *iav; av = new AnnVector; assert(av != NULL); *av = vec; iav = static_cast (av); assert(iav != NULL); m_samples.push_back(iav); return true; } IAnnVector* AnnVectorContainer::get_vector(int i /* = -1 */) { int n = static_cast (m_samples.size()); assert(i > -3); assert(i < n); assert(n > 0); if (i == -1) { m_curr_sample = (m_curr_sample + 1) % n; } else if (i== -2) { m_curr_sample= prob_get_range(0, n - 1); } else { m_curr_sample = i; } return m_samples[m_curr_sample]; } ann_uint AnnVectorContainer::get_count() { return static_cast (m_samples.size()); } AnnVectorContainer::~AnnVectorContainer() { std::vector ::iterator i; for (i=m_samples.begin(); i != m_samples.end(); ++i) { if ((*i) != NULL) delete (*i); } } ostream &AnnVectorContainer::operator >> (ostream &os) { assert(os.good()); IAnnVector *vec; os << "VECCON001" << endl << endl; os << "COUNT " << get_count() << endl << endl; for (ann_uint i=0; i (vec)); } return os; } istream &AnnVectorContainer::operator << (istream &is) { assert(os.good()); char tmp[128]; is >> tmp >> tmp >> tmp; int size = atoi(tmp); AnnVector vec; for (int i=0; i > vec; add(vec); } return is; } /////////////////////////////////////////////////////////////////// // class AnnSampleSet /////////////////////////////////////////////////////////////////// bool AnnSampleSet::get_sample(IAnnVector *vec_in, IAnnVector *vec_out, int i /* = -2 */ ) { assert(vec_in != NULL); assert(vec_out != NULL); IAnnVector *vec_env; vec_env = m_vec_container.get_vector(i); if (vec_env == NULL) return false; vec_env->get_sub_vector(0, m_input_division, vec_in); vec_env->get_sub_vector(m_input_division, m_output_division, vec_out); return true; }; ostream &AnnSampleSet::operator >> (ostream &os) { assert(os.good()); os << "SAMSET001" << endl << endl << "INPUT_DIVISION " << m_input_division << endl << "OUTPUT_DIVISION " << m_output_division << endl << endl << m_vec_container; return os; } istream &AnnSampleSet::operator << (istream &is) { assert(is.good()); char tmp[128], indiv[32], outdiv[32]; is >> tmp >> tmp >> indiv >> tmp >> outdiv >> m_vec_container; return is; } AnnSampleSet * generate_builtin_sample(const char *name, AnnSampleSet *ass) { assert(name != NULL); assert(ass != NULL); AnnVector vec; AnnVectorContainer *avc = &ass->m_vec_container; if (strcmp(name, "xor") == 0) { ann_float a [][3] = { {-1, -1, 1}, {-1, 1, -1}, {1, -1, -1}, {1, 1, 1} }; ass->set_division(2, 1); vec.set_size(3); for (int i=0; i<4; ++i) { ann_float n[3]; for (int j=0; j<3; ++j) { if (a[i][j] > 0) { n[j] = 1.0; } else { n[j] = -1.0; } } vec.set_element(0, n, 3); avc->add(vec); } } else if (strcmp(name, "or") == 0) { ann_float a [][3] = { {-1, -1, -1}, {-1, 1, 1}, {1, -1, 1}, {1, 1, 1} }; ass->set_division(2, 1); vec.set_size(3); for (int i=0; i<4; ++i) { ann_float n[3]; for (int j=0; j<3; ++j) { if (a[i][j] > 0) { n[j] = 1.0; } else { n[j] = -1.0; } } vec.set_element(0, n, 3); avc->add(vec); } } else if (strcmp(name, "and") == 0) { ann_float a [][3] = { {-1, -1, -1}, {-1, 1, -1}, {1, -1, -1}, {1, 1, 1} }; ass->set_division(2, 1); vec.set_size(3); for (int i=0; i<4; ++i) { ann_float n[3]; for (int j=0; j<3; ++j) { if (a[i][j] > 0) { n[j] = 1.0; } else { n[j] = -1.0; } } vec.set_element(0, n, 3); avc->add(vec); } } else if (memcmp(name, "宇称", 4) == 0) { int n = name[4] - '0'; if (n < 2 || n > 9) return NULL; int size = 1 << n; int a[10]; ann_float f[10]; int result; ass->set_division(n, 1); vec.set_size(n + 1); for (int i=0; i add(vec); } } else { return NULL; } strncpy(ass->name, name, sizeof(ass->name)); ass->name[sizeof(ass->name) - 1] = '\0'; return ass; } /* static void build_sample2(AnnVectorContainer *sample) { AnnVector vec; ann_float a [][10] = { {1, 1, 1, -1, -1, 1, 1, 1, 1, -1}, {1, 1, -1, -1, -1, 1, 1, 1, -1, 1}, {1, -1, -1, -1, 1, 1, 1, -1, 1, 1}, {-1, -1, -1, 1, 1, 1, -1, 1, 1, 1}, {-1, -1, 1, 1, 1, -1, 1, 1, 1, 1}, }; assert(sample != NULL); vec.set_size(10); for (int i=0; i<5; ++i) { ann_float n[10]; for (int j=0; j<10; ++j) { if (a[i][j] > 0) { n[j] = 1.0; } else { n[j] = -1.0; } } vec.set_element(0, n, 10); sample->add(vec); } } static void build_sample3(AnnVectorContainer *sample) { AnnVector vec; ann_float a [][10] = { {1, 1, 1, 1, -1, 1, -1, -1, -1, -1}, {1, 1, 1, -1, 1, -1, 1, -1, -1, -1}, {1, 1, -1, 1, 1, -1, -1, 1, -1, -1}, {1, -1, 1, 1, 1, -1, -1, -1, 1, -1}, {-1, 1, 1, 1, 1, -1, -1, -1, -1, 1}, }; assert(sample != NULL); vec.set_size(10); for (int i=0; i<5; ++i) { ann_float n[10]; for (int j=0; j<10; ++j) { if (a[i][j] > 0) { n[j] = 1.0; } else { n[j] = -1.0; } } vec.set_element(0, n, 10); sample->add(vec); } } */ } // namespace ann