Example #1
0
 explicit BigNumber(string v) {
     int i = 0;
     if (v[i] == '-') {
         sign = 1;
         i++;
     }
     while (i < v.size()) {
         if (isdigit(v[i])) {
             integerPart.push_back(v[i]);
         } else {
             if (v[i] != '.')
                 throw std::runtime_error("NaN");
             break;
         }
         i++;
     }
     if (v[i] == '.') {
         i++;
         while (i < v.size()) {
             if (isdigit(v[i]))
                 fractionaryPart.push_back(v[i]);
             else
                 throw std::runtime_error("NaN");
             i++;
         }
     }
     reverse(integerPart.begin(), integerPart.end());
     if (fractionaryPart.size())
         reverse(fractionaryPart.begin(), fractionaryPart.end());
 }
    bool __next_perm(vector<int>::iterator beg, vector<int>::iterator end) {
        if (beg == end) {
            return false;
        }

        vector<int>::iterator i = beg;
        ++i;
        if (i == end) {
            return false;
        }

        i = end;
        --i;

        for (;;) {
            vector<int>::iterator ii = i;
            --i;
            if (*i < *ii) {
                vector<int>::iterator j = end;
                while (!(*i < *--j));

                std::iter_swap(i, j);
                reverse(ii, end);
                return true;
            }

            if (i == beg) {
                reverse(beg, end);
                return false;
            }
        }
    }
Example #3
0
    std::tuple<bool, vector<char>> addTwoVectors(vector<char> base,
    vector<char> visitor) {
        // TODO(alex): change these reverses
        reverse(base.begin(), base.end());
        reverse(visitor.begin(), visitor.end());

        while (base.size() < visitor.size())
            base.push_back('0');
        while (visitor.size() < base.size())
            visitor.push_back('0');

        reverse(base.begin(), base.end());
        reverse(visitor.begin(), visitor.end());

        bool carry = 0;
        for (int i = 0; i < base.size(); i++) {
            base[i] += visitor[i] + carry - '0';
            if (base[i] > '9') {
                carry = 1;
                base[i] -= '9';
            } else {
                carry = 0;
            }
        }

        return make_tuple(carry, base);
    }
Example #4
0
void GerberImporter::merge_paths(multi_linestring_type &destination, const linestring_type& source)
{
    if (!destination.empty())
    {
        multi_linestring_type::reverse_iterator ls;

        for (ls = destination.rbegin(); ls != destination.rend(); ls++)
        {
            if (bg::equals(ls->back(), source.front()))
            {
                ls->insert(ls->end(), source.begin() + 1, source.end());
                break;
            }
            else if (bg::equals(ls->back(), source.back()))
            {
                ls->insert(ls->end(), source.rbegin() + 1, source.rend());
                break;
            }

            /*
             * The following two cases does not happen very often, and they
             * usually happen when the size of destination is small (often 2),
             * therefore there shouldn't be the need to replace a standard
             * linestring_type (std::vector) with a std::deque
             */
            else if (bg::equals(ls->front(), source.front()))
            {
                reverse(ls->begin(), ls->end());
                ls->insert(ls->end(), source.begin() + 1, source.end());
                break;
            }
            else if (bg::equals(ls->front(), source.back()))
            {
                reverse(ls->begin(), ls->end());
                ls->insert(ls->end(), source.rbegin() + 1, source.rend());
                break;
            }
        }

        if (ls == destination.rend())
        {
            destination.push_back(source);
        }
    }
    else
    {
        destination.push_back(source);
    }
}
Example #5
0
 string toString() {
     string answer;
     if (sign)
         answer += "-";
     string x = string(integerPart.data(), integerPart.size());
     reverse(x.begin(), x.end());
     answer += x;
     if (fractionaryPart.size()) {
         answer += ".";
         string x = string(fractionaryPart.data(), fractionaryPart.size());
         reverse(x.begin(), x.end());
         answer += x;
     }
     return answer;
 }
int findPositionOfMostMatches(
    const string& first_string,
    const string& second_string
    ) {
  int number_of_possible_positions = 
      first_string.length() - second_string.length() + 1;
  sequence<> literal_match_places(number_of_possible_positions);
  for (int literal_index = 0; 
      literal_index < LITERALS_LENGTH;
      ++literal_index
      ) {
    vector<int> first_polynomial = 
        binarizeStringByLiteral(first_string, LITERALS[literal_index]);
    vector<int> second_polynomial = 
        binarizeStringByLiteral(second_string, LITERALS[literal_index]);
    vector<int> product;
    reverse(first_polynomial.begin(), first_polynomial.end());
    multiplyWithFFT(first_polynomial, second_polynomial, &product);
    literal_match_places += 
        findMatchesByProduct(
            product, 
            first_string.length(), 
            number_of_possible_positions
            );
  }
  return literal_match_places.find_leftmost_max() + 1;
}
 void reverseWords(string &s) {
     int ls = s.size();
     int i, j;
     
     i = 0;
     j = 0;
     while (i < ls && s[i] == ' ') {
         ++i;
     }
     while (i < ls) {
         while (i < ls && s[i] != ' ') {
             s[j++] = s[i++];
         }
         if (i == ls) {
             break;
         }
         while (i < ls && s[i] == ' ') {
             ++i;
         }
         s[j++] = ' ';
     }
     s.resize(j);
     ls = s.size();
     
     i = 0;
     while (i < ls) {
         while (i < ls && s[i] == ' ') {
             ++i;
         }
         if (i == ls) {
             break;
         }
         j = i + 1;
         while (j < ls && s[j] != ' ') {
             ++j;
         }
         reverse(s.begin() + i, s.begin() + j);
         i = j;
     }
     while (s.size() > 0 && s.back() == ' ') {
         s.pop_back();
     }
     reverse(s.begin(), s.end());
 }
Example #8
0
 void buildPath(map<string, vector<string> > &father, vector<string> path,
         const string &start, const string &word, vector<vector<string> > &result) {
     path.push_back(word);
     if (word == start) {
         result.push_back(path);
         reverse(result.back().begin(), result.back().end());
     } else {
         for (auto f : father[word]) {
             buildPath(father, path, start, f, result);
         }
     }
     path.pop_back();
 }
Example #9
0
int main(int argc, char *argv[])
{
	string input_file;

	// Check first argument if it exists for input file, otherwise ask user
	if (argc > 1)
	{
		input_file = argv[1];
	}
	else
	{
		cout << "Please enter the path to your input file: " << endl;
		cin >> input_file;
	}

	// Open input file and check if successfully opened
	ifstream ifs(input_file);
	if (!ifs)
	{
		cout << "Failed to open input file." << endl;
		return 1;
	}

	string line;
	while (getline(ifs, line))
	{
		unsigned int number_of_iterations = 0; 

		// If the length is one by default it's a palindrome
		if (line.length() == 1)
		{
			cout << number_of_iterations << " " << line << endl;
			continue;
		}

		while (!is_palindrome(line))
		{
			int original_number = stoi(line); // Convert line to an int
			reverse(line.begin(), line.end()); // Reverse the order of line
			int reversed_number = stoi(line); 
			int new_number = original_number + reversed_number; 
			line = to_string(new_number); 
			number_of_iterations++;
		}
		cout << number_of_iterations << " " << line << endl;
	}

	return 0;
}
 vector<int> findClosestElements(vector<int>& arr, int k, int x) {
     vector<int> res;
     if (k <= 0) {
         return res;
     }
     
     priority_queue<int, vector<int>, greater<int>> pq1;
     priority_queue<int, vector<int>, less<int>> pq2;
     
     int i;
     for (i = 0; i < k; ++i) {
         if (arr[i] >= x) {
             pq2.push(arr[i]);
         } else {
             pq1.push(arr[i]);
         }
     }
     
     int n = arr.size();
     for (i = k; i < n; ++i) {
         if (arr[i] >= x) {
             pq2.push(arr[i]);
         } else {
             pq1.push(arr[i]);
         }
         if (pq1.empty()) {
             pq2.pop();
         } else if (pq2.empty()) {
             pq1.pop();
         } else if (x - pq1.top() > pq2.top() - x) {
             pq1.pop();
         } else {
             pq2.pop();
         }
     }
     
     int n1 = pq1.size();
     while (!pq1.empty()) {
         res.push_back(pq1.top());
         pq1.pop();
     }
     while (!pq2.empty()) {
         res.push_back(pq2.top());
         pq2.pop();
     }
     reverse(res.begin() + n1, res.end());
     
     return res;
 }
string invertBoard(string board)
{
    string tempBoard = board;
    reverse(tempBoard.begin(), tempBoard.end());
    
    // need a temp character
    replace(tempBoard.begin(), tempBoard.end(), 'r', 't' );
    replace(tempBoard.begin(), tempBoard.end(), 'R', 'T' );
    
    replace(tempBoard.begin(), tempBoard.end(), 'b', 'r' );
    replace(tempBoard.begin(), tempBoard.end(), 'B', 'R' );
    
    replace(tempBoard.begin(), tempBoard.end(), 't', 'b' );
    replace(tempBoard.begin(), tempBoard.end(), 'T', 'B' );
    
    return tempBoard;
}
Example #12
0
string multiplyTwoVectorsElementByElement(vector<int> &left, vector<int> &right){
    vector<int> int_results;
    for(int i = 0; i < left.size(); ++i){
        int_results.emplace_back(left[i] * right[i]);
    }
    reverse(int_results.begin(), int_results.end());
    
    string result = "";
    
    for(int i = 0; i < int_results.size(); ++i){
        result += intToString(int_results[i]);
        if(i < int_results.size() - 1)
            result += " ";
    }
    
    return result;
}
Example #13
0
 string convertToBase7(int num) {
     static const int R = 7;
     
     if (num < 0) {
         return "-" +convertToBase7(-num);
     }
     if (num == 0) {
         return "0";
     }
     string s = "";
     while (num > 0) {
         s.push_back(num % R + '0');
         num /= R;
     }
     reverse(s.begin(), s.end());
     
     return s;
 }
PairStringBool SingleEntryParameters::createTemporaryDatabase ( bool randomFlag, bool reverseFlag, const string& tempDir ) const
{
	static string key = genToLower ( genRandomString ( 10 ) );
	PPTempFile pptf ( "", "" );					// Move the directory to the temporary directory
	tempDBFullPath = pptf.getFullPathDir () + SLASH;

	if ( tempDir.empty () )	{
		tempDBFullPath += key;
	}
	else
		tempDBFullPath += tempDir;

	bool newDB;
	if ( genCreateNewDirectory ( tempDBFullPath ) ) {
		tempDBFullPath += SLASH;
		tempDBFullPath += "UserProtein.fasta";
		FILE* fp = gen_fopen_binary ( tempDBFullPath, "w", "Creating temporary database" );
		for ( int i = 0 ; i < getNumEntries () ; i++ ) {
			writeProteinEntry ( fp, names [i], userProteinSequence [i] );
		}
		gen_fclose ( fp, "Creating temporary database" );
		if ( randomFlag || reverseFlag ) {
			string suffix;
			if ( randomFlag ) suffix = ".random.fasta";
			if ( reverseFlag ) suffix = ".reverse.fasta";
			FILE* fp = gen_fopen_binary ( tempDBFullPath.substr ( 0, tempDBFullPath.length () - 6 ) + suffix, "w", "Creating temporary database" );
			for ( int i = 0 ; i < getNumEntries () ; i++ ) {
				string p = userProteinSequence [i];
				if ( randomFlag )	random_shuffle ( p.begin (), p.end () );
				else				reverse ( p.begin (), p.end () );
				writeProteinEntry ( fp, names [i], p );
			}
			gen_fclose ( fp, "Creating temporary database" );
		}
		newDB = true;
	}
	else {
		newDB = false;
		tempDBFullPath += SLASH;
		tempDBFullPath += "UserProtein.fasta";
	}
	return make_pair ( tempDBFullPath, newDB );
}
Example #15
0
void find_neg_cycle1 (const vector<vector<double> >& moneyMatrix, vector<size_t>& cycle)
{
    const size_t start_v = 0;
   
    vector<double> distance (moneyMatrix.size (), 0.0);
    vector<size_t> prev (moneyMatrix.size (), NOT_SET);
    distance[start_v] = 1.0;
    for (size_t i = 0; i < moneyMatrix.size (); ++i)
    {
        for (size_t v = 0; v < moneyMatrix.size (); ++v)
            for (size_t u = 0; u < moneyMatrix.size (); ++u)
            {
                if (moneyMatrix[v][u] < 0.0)
                    continue;

                if (distance[u] < distance[v] * moneyMatrix[v][u])
                {
                    distance[u] = distance[v] * moneyMatrix[v][u];
                    prev[u] = v;
                }
            }
    }

    vector<bool> in_cycle (moneyMatrix.size (), false);
    for (size_t i = 0; i < moneyMatrix.size (); ++i)
        if (distance[i] > 1.0)
        {
            cycle.push_back (i);
            in_cycle[i] = true;
            size_t cur_v = prev[i];
            while (cur_v != i && !in_cycle[cur_v])
            {
                cycle.push_back (cur_v);
                in_cycle[cur_v] = true;
                cur_v = prev[cur_v];
            }

            reverse (cycle.begin (), cycle.end ());

            break;
        }
}
 vector<int> closestKValues(TreeNode* root, double target, int k) {
     TreeIterator it1(root, target);
     TreeReverseIterator it2(root, target);
     
     if (it1.hasNext() && it2.hasNext() && it1.peek() == it2.peek()) {
         (void)it1.next();
     }
     
     vector<int> v1, v2;
     vector<int> res;
     int i;
     int c1, c2;
     for (i = 0; i < k; ++i) {
         if (!it1.hasNext() && !it2.hasNext()) {
             break;
         }
         if (!it1.hasNext()) {
             v2.push_back(it2.next());
             continue;
         }
         if (!it2.hasNext()) {
             v1.push_back(it1.next());
             continue;
         }
         
         c1 = it1.peek();
         c2 = it2.peek();
         if (abs(c1 - target) < abs(c2 - target)) {
             v1.push_back(it1.next());
         } else {
             v2.push_back(it2.next());
         }
     }
     reverse(v1.begin(), v1.end());
     res.insert(res.end(), v1.begin(), v1.end());
     res.insert(res.end(), v2.begin(), v2.end());
     
     v1.clear();
     v2.clear();
     return res;
 }
Example #17
0
int main (int argc, char* const argv[])
{
    ifstream input_file(argv[1]);
    string line;

    if (input_file)
    {
        while (getline(input_file, line))
        {
            reverse(line.begin(), line.end());
            line.erase(remove(line.begin(), line.end(), ' '), line.end());

            int sum = 0;
            for (int i = 0; i < line.size(); ++i)
            {
                int digit = line[i] - '0';
                if ((i + 1) % 2 == 0)
                {
                    digit *= 2;
                    if (digit > 9)
                    {
                        int digit_1 = digit / 10;
                        int digit_2 = digit % 10;
                        digit = digit_1 + digit_2;
                    }
                }
                sum += digit;
            }
            if (sum % 10 == 0)
                cout << 1 << endl;
            else
                cout << 0 << endl;
        }
        input_file.close();
    }
    return 0;
}
Example #18
0
void stringToIntNumbers(const vector<string> &strings, vector<int> &ints){
    for(int i = 0; i < strings.size(); ++i){
        ints.emplace_back(stringToInt(strings[i]));
    }
    reverse(ints.begin(), ints.end());
}
Example #19
0
void TreeNode::generate_hme_model(fstream* save_stream) {
	save_stream->write((char *) &is_leaf_, sizeof(is_leaf_));
	if (is_leaf_) {
		Matrix x_matrix;
		Matrix response_vector;
		x_matrix.reserve(rows_->size());
		response_vector.reserve(rows_->size());
		//divide onto y and x values
		for (uint i = 0; i != rows_->size(); i++) {
			vector<double>::iterator it = ++rows_->at(i)->begin();
			x_matrix.push_back(vector<double>(it, rows_->at(i)->end()));
			response_vector.push_back(vector<double>(rows_->at(i)->begin(), it));
		}

		Matrix transposed_x_matrix = transpose(x_matrix);
		//remove const parameters
		vector<uint> removed_const_parameters;
		for (uint i = 0; i != transposed_x_matrix.size(); i++) {
			bool ok = false;
			for (uint j = 1; j != transposed_x_matrix[0].size(); j++) {
				if (transposed_x_matrix[i][j] != transposed_x_matrix[i][0]) {
					ok = true;
					break;
				}
			}
			if (!ok) {
				transposed_x_matrix.erase(transposed_x_matrix.begin() + i);
				removed_const_parameters.push_back(i + 1); //shift depends on insert const columb
				--i;
			}
		}

		//inserting const column
		transposed_x_matrix.insert(transposed_x_matrix.begin(),
				vector<double>(transposed_x_matrix[0].size(), 1.0));

		vector<uint> korrelation_removed_parameters;
		if (max_params_correlation_ < 1.0) {
			//correlation calculate
			//calculate avg_value
			vector<double> avg_param_val;
			avg_param_val.reserve(transposed_x_matrix.size());
			for (uint i = 0; i != transposed_x_matrix.size(); i++) {
				double val = 0;
				for (uint j = 0; j != transposed_x_matrix[0].size(); j++) {
					val += transposed_x_matrix[i][j];
				}
				avg_param_val.push_back(val / transposed_x_matrix[0].size());
			}
			//calculate sum_sqr_difference && diff matrix
			vector<double> sum_sqr_dif;
			sum_sqr_dif.reserve(transposed_x_matrix.size());
			Matrix dif_matrix = matrix_utils::create_matrix(transposed_x_matrix.size(),
					transposed_x_matrix[0].size());
			for (uint i = 0; i != transposed_x_matrix.size(); i++) {
				double val = 0;
				for (uint j = 0; j != transposed_x_matrix[0].size(); j++) {
					double tmp = transposed_x_matrix[i][j] - avg_param_val[i];
					dif_matrix[i][j] = tmp;
					val += tmp * tmp;
				}
				sum_sqr_dif.push_back(val);
			}

			for (uint i = 0; i != transposed_x_matrix.size(); i++) {
				for (uint j = i + 1; j != transposed_x_matrix.size(); j++) {
					double val = 0;
					for (uint k = 0; k != transposed_x_matrix[0].size(); k++) {
						val += dif_matrix[i][k] * dif_matrix[j][k];
					}
					val /= sqrt(sum_sqr_dif[i] * sum_sqr_dif[j]);
					if (fabs(val) > max_params_correlation_) {
						korrelation_removed_parameters.push_back(j);
						dif_matrix.erase(dif_matrix.begin() + j);
						transposed_x_matrix.erase(transposed_x_matrix.begin() + j);
						j--;
					}
				}
			}
		}

		vector<uint> removed_linear_dependenced_parameters = remove_linear_dependence_rows(
				transposed_x_matrix);
		// cann't remove first const column
		if (removed_linear_dependenced_parameters.size()) {
			assert(removed_linear_dependenced_parameters[0] > 0);
		}

		x_matrix = transpose(transposed_x_matrix);

		vector<double> weight_vector =
				transpose(
						inversion(transposed_x_matrix * x_matrix)
								* (transposed_x_matrix * response_vector))[0];

		//place zeroes in place of removed parameters in reverse order
		reverse(removed_linear_dependenced_parameters.begin(),
				removed_linear_dependenced_parameters.end());
		for (uint i = 0; i != removed_linear_dependenced_parameters.size(); i++) {
			weight_vector.insert(weight_vector.begin() + removed_linear_dependenced_parameters[i],
					0);
		}
		if (max_params_correlation_ < 1.0) {
			reverse(korrelation_removed_parameters.begin(), korrelation_removed_parameters.end());
			for (uint i = 0; i != korrelation_removed_parameters.size(); i++) {
				weight_vector.insert(weight_vector.begin() + korrelation_removed_parameters[i], 0);
			}
		}
		reverse(removed_const_parameters.begin(), removed_const_parameters.end());
		for (uint i = 0; i != removed_const_parameters.size(); i++) {
			weight_vector.insert(weight_vector.begin() + removed_const_parameters[i], 0);
		}

		for (uint i = 0; i != weight_vector.size(); i++) {
			save_stream->write((char *) &weight_vector[i], sizeof(weight_vector[i]));
		}

		if (debug_output_) {
			fstream outS("addit1.txt", std::ios_base::out | std::ios_base::app);
			outS.setf(std::ios_base::fixed);
			outS.precision(6);
			Matrix weight_vector_test;
			weight_vector_test.push_back(weight_vector);
			weight_vector_test = transpose(weight_vector_test);
			double sum = 0;

			for (uint i = 0; i != rows_->size(); i++) {
				Matrix xVC;
				xVC.push_back(vector<double>(rows_->at(i)->begin() + 1, rows_->at(i)->end()));
				xVC[0].insert(xVC[0].begin(), 1);
				Matrix rez = xVC * weight_vector_test;
				double tmp = rez[0][0] - rows_->at(i)->at(0);
				sum += tmp * tmp;
			}
			outS << sum_sqr_difference_ << ' ' << sum << ' ' << rows_->size() << ' '
					<< removed_linear_dependenced_parameters.size() << ' '
					<< korrelation_removed_parameters.size() << ' '
					<< removed_const_parameters.size() << endl;
			outS.close();
			/*outS.open("addit.txt", std::ios_base::out | std::ios_base::app);
			outS << x_matrix.size() << '*' << x_matrix[0].size() << endl;
			for (uint i = 0; i != x_matrix.size(); i++) {
				outS << response_vector[i][0];
				for (uint j = 0; j != x_matrix[i].size(); j++) {
					outS << ' ' << x_matrix[i][j];
				}
				outS << endl;
			}
			outS << endl;

			for (uint i = 0; i != weight_vector.size(); i++) {
				outS << weight_vector[i] << ' ';
			}
			outS << endl << endl;
			outS.close();*/
			outS.open("weight.txt", std::ios_base::out | std::ios_base::app);
			for (uint i = 0; i != weight_vector.size(); i++) {
				outS << weight_vector[i] << ' ';
			}
			outS << endl;
			outS.close();
		}

	} else {
		//init gate with two oppositely directed vectors
		double vector_length = 1;
		double zero = 0;
		double tmp = split_value_ * vector_length;

		save_stream->write((char *) &tmp, sizeof(tmp));
		for (int i = 1; i != split_index_; i++) {
			save_stream->write((char *) &zero, sizeof(zero));
		}
		tmp = -vector_length;
		save_stream->write((char *) &tmp, sizeof(tmp));
		for (uint i = split_index_ + 1; i != rows_->at(0)->size(); i++) {
			save_stream->write((char *) &zero, sizeof(zero));
		}

		left_child_->generate_hme_model(save_stream);
		right_child_->generate_hme_model(save_stream);
	}
}
Example #20
0
void PFG::set_dac_recursive(state_sequent& the_sequence, state::iterator& the_state) {
	
	state_sequent* a_sequence = dynamic_cast<state_sequent*>(*the_state);
	// Am I a sequence? Yes? Go one sequence further
	if (a_sequence != NULL) { 
		for(state_sequent::iterator child_state = a_sequence->begin(); child_state != a_sequence->end(); ++child_state)
			set_dac_recursive(*a_sequence, child_state);
	}
	// I am not a sequence, but a state
	else {
		state* this_state = dynamic_cast<state*>(*the_state);
		if (this_state == NULL) 
			throw pfg_exception( "state_atom in state_sequent not expected");
		analogout* PFG_aout = NULL;
		// find an analogout section with suitable id
		state::iterator i = this_state->begin();
		while(i!=this_state->end()) {  // state members loop
			analogout* aout = dynamic_cast<analogout*>(*i); // initialize new analogout
			analogout* next_aout = dynamic_cast<analogout*>(*i++);
			i--;
			// This is for me, analogout is != NULL (there is an analogout) and has my ID
			if (aout!=NULL && aout->id == id) {
				if (PFG_aout == NULL) {
					// save the informations 
					PFG_aout = aout;
				}
				// there is no place for me here
				else {
					throw pfg_exception( "found another DAC section, ignoring");
					delete aout;
				}
				// remove the analog out section
				this_state->erase(i++);
			}
			else {
			    ++i;
			}
		} // state members loop
		
		if (PFG_aout != NULL) { // state modifications
			// check the length of the state
			if (this_state->length < TIMING*41.0)
				throw pfg_exception( "time is too short to save DAC information");
			else {
				// copy of original state
				state* register_state = new state(*this_state);
				ttlout* register_ttls = new ttlout();
				register_ttls->id = 0;
				register_state->length = TIMING;
				register_state->push_back(register_ttls);
				if (PFG_aout->dac_value > (pow(2.0, int(DAC_BIT_DEPTH-1))-1) )
					throw pfg_exception("dac_value too high");
				if ( abs(PFG_aout->dac_value) > pow(2.0, int(DAC_BIT_DEPTH-1)) )
					throw pfg_exception("dac_value too low");
				// now, insert the ttl information
				vector<int> dac_word;
				for (int j = 0; j < DAC_BIT_DEPTH ; j++)	{
					int bit = PFG_aout->dac_value & 1;
					dac_word.push_back(bit);
					cout << dac_word[j];
					PFG_aout->dac_value >>= 1;
					}
				// need one clock cycle to read in bit
				// latch enable (LE) should always be high while doing so
				// except for the last bit
				// reverse the bit pattern
				reverse(dac_word.begin(), dac_word.end());
				
				for (int i = 0; i < DAC_BIT_DEPTH; i++) {
					register_ttls->ttls = (1 << DATA_BIT)*dac_word[i] + (1 << CLK_BIT) + (1 << LE_BIT);
					the_sequence.insert(the_state,register_state->copy_new());
					register_ttls->ttls = (1 << DATA_BIT)*dac_word[i] + (1 << LE_BIT);
					the_sequence.insert(the_state,register_state->copy_new());
					//std::cout << dac_word[i];
					if (i == (DAC_BIT_DEPTH-1)) {// last bit => LE low, tell DAC to read the word in 
						register_ttls->ttls = 0; //  1<< DATA_BIT*bit;
						the_sequence.insert(the_state,register_state->copy_new());
					}
				}
				
				// shorten the remaining state 
				// and add LE high to this state
				ttlout* ttls=new ttlout();
				// 42nd pulse
				this_state->length -= TIMING*41;
				ttls->ttls = 1 << LE_BIT;
				this_state->push_front(ttls);
				delete register_state;
				delete PFG_aout;	

			}	
		}
		else {
			ttlout* le_ttls=new ttlout();
			le_ttls->ttls = 1 << LE_BIT;
			this_state->push_back(le_ttls);
		}
		// end of state modifications 
	} // I was a state
void PFG::set_dac_recursive(state_sequent& the_sequence, state::iterator& the_state) {
    state_sequent* a_sequence = dynamic_cast<state_sequent*>(*the_state);
// Am I a sequence? Yes? Go one sequence further
    if (a_sequence != NULL) {
        for(state_sequent::iterator child_state = a_sequence->begin();
                child_state != a_sequence->end();
                ++child_state)
            set_dac_recursive(*a_sequence, child_state);
    }
// I am not a sequence, but a state
    else {
        state* this_state = dynamic_cast<state*>(*the_state);
        if (this_state == NULL)
            throw pfg_exception( "state_atom in state_sequent not expected");
        analogout* PFG_aout = NULL;
        // Find an analogout section with suitable id
        state::iterator i = this_state->begin();
        while(i!=this_state->end()) {  // Begin state members loop
            analogout* aout = dynamic_cast<analogout*>(*i); // Initialize new analogout
            analogout* next_aout = dynamic_cast<analogout*>(*i++);
            i--;
            // This is for me, analogout is != NULL (there is an analogout) and has my ID
            if (aout!=NULL && aout->id == id) {
                if (PFG_aout == NULL) {
                    // Save the informations
                    PFG_aout = aout;
                }
                // There is no place for me here
                else {
                    throw pfg_exception( "found another DAC section, ignoring");
                    delete aout;
                }

                // Remove the analogout section
                this_state->erase(i++);
            }
            // Nothing to see, move on
            else {
                ++i;
            }
        } // End state members loop

        if (PFG_aout != NULL) { // Begin state modifications
            // Check the length of the state
            if (this_state->length < TIMING*41.0)
                throw pfg_exception( "time is too short to save DAC information");
            else {
                // Copy of original state
                state* register_state = new state(*this_state);
                ttlout* register_ttls = new ttlout();
                register_ttls->id = 0;
                register_state->length = TIMING;
                register_state->push_back(register_ttls);
                // Return error if dac_value is out of bounds
                if (PFG_aout->dac_value > (pow(2.0, int(DAC_BIT_DEPTH-1))-1) )
                    throw pfg_exception("dac_value too high");
                if ( abs(PFG_aout->dac_value) > pow(2.0, int(DAC_BIT_DEPTH-1)) )
                    throw pfg_exception("dac_value too low");
                // Now, create the bit pattern
                vector<int> dac_word;
                for (int j = 0; j < DAC_BIT_DEPTH ; j++) {
                    int bit = PFG_aout->dac_value & 1;
                    dac_word.push_back(bit);
                    PFG_aout->dac_value >>= 1;
                }
                // Reverse the bit pattern
                reverse(dac_word.begin(), dac_word.end());
                /*
                	Datasheet AD1862:
                		- Bit is read with rising edge of the CLK
                   		- Word is read with falling edge of LE
                   	The opto-coupler in the DAC20 are inverting the signal!
                	CLK is here inverted, the rest not. This does not affect functionality
                	because the inverse of a 2s complement is then just negative - 1:
                	Example:
                		5 bits:
                		 15 --> 01111 -->inverting--> 10000 = -16
                		  1 --> 00001 -->inverting--> 11110 = -2
                		  0 --> 00000 -->inverting--> 11111 = -1
                		 -1 --> 11111 -->inverting--> 00000 =  0
                		 -2 --> 11110 -->inverting--> 00001 =  1
                		-16 --> 10000 -->inverting--> 01111 =  15
                	Latch enable is going high after 41st bit.
                */

                // Transfer the bit pattern
                for (int i = 0; i < DAC_BIT_DEPTH; i++) {
                    // Two states = one clock cycle to read in bit
                    // State 1
                    register_ttls->ttls=(1<<DATA_BIT)*dac_word[i]+(1<<CLK_BIT)+(1<<LE_BIT);
                    the_sequence.insert(the_state,register_state->copy_new());
                    // State 2
                    register_ttls->ttls = (1<<DATA_BIT)*dac_word[i]+(1<<LE_BIT);
                    the_sequence.insert(the_state,register_state->copy_new());
                    if (i == (DAC_BIT_DEPTH-1)) {
                        // Last bit => LE -> 0, prepare DAC to read the word in
                        register_ttls->ttls = 0;
                        the_sequence.insert(the_state,register_state->copy_new());
                    }
                }

                /*
                	Shorten the remaining state
                	and add LE high to this state.
                	The word is read in.
                */
                ttlout* ttls=new ttlout();
                // 42nd pulse
                this_state->length -= TIMING*41;
                // Here is the word read in
                ttls->ttls = 1 << LE_BIT;
                this_state->push_front(ttls);
                delete register_state;
                delete PFG_aout;

            }
        }
        else {
            ttlout* le_ttls=new ttlout();
            le_ttls->ttls = 1 << LE_BIT;
            this_state->push_back(le_ttls);
        }
        // End state modifications
    } // I was a state