/* * This file is part of rasdaman community. * * Rasdaman community is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Rasdaman community is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with rasdaman community. If not, see . * * Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / rasdaman GmbH. * * For more information please see * or contact Peter Baumann via . / /** * SOURCE: gen_pattern.cc * * MODULE: rasodmg * * PURPOSE: generate patterns for r_StatTiling. * * COMMENTS: * None */ /* ATENTION: The format of the input file for using with this program is: number_of_patterns minterval_domain d_dim1 d_dim2 ... d_dimn percentage minterval_pattern ... Example: 1000 [1:800,1:600] 10 10 0.40 [10:600,30:300] 0.60 [70:500,400:500] Creates a file with 1000 patterns on a 800x600 domain. The pixels are generated having borders with a maximum variation of 10 pixels from the specified interest zones. And 2 interest zones are specified, one for 40% of the patterns, another for 60%. */ #include #include #include #include #include #include #include "raslib/minterval.hh" #include "raslib/sinterval.hh" #include "raslib/dlist.hh" const int BUF_SIZE = 200; char* in_filename; char* out_filename; int total_patterns; int dim; int* delta; r_Minterval* domain; struct IArea { r_Minterval iarea; double percent; IArea(r_Minterval& area, double percentage) : iarea(area), percent(percentage) { } }; DList IAreas; void parse(int argc, char** argv) { if ((argc == 1) || ((argc == 2) && (strcmp(argv[1], "-h") == 0))) { cout << "Usage: " << argv[0] << " [input_filename] [output_filename]" << endl; exit(0); } if (argc != 3) { cout << "Usage: " << argv[0] << " [input_filename] [output_filename]" << endl; exit(0); } in_filename = argv[1]; out_filename = argv[2]; } void get_specification() { char buf[BUF_SIZE+1], buf2[BUF_SIZE+1]; double perc; ifstream is(in_filename); if (!is) { cout << "Could not open " << in_filename << "." << endl; exit(0); } cout << "Reading parameters... " << endl; is >> total_patterns; is.getline(buf, BUF_SIZE); domain = new r_Minterval(buf); dim = domain->dimension(); if (total_patterns <= 0) { cout << "Invalid number of patterns: " << total_patterns << endl; exit(0); } if (dim <= 0) { cout << "Invalid domain: " << *domain << endl; delete domain; exit(0); } cout << endl << "Patterns: " << total_patterns << endl; cout << "Domain: " << *domain << endl; cout << "Dimension: " << dim << " ("; delta = new int[dim]; for (int i=0; i> delta[i]; cout << "*"; } cout << ")" << endl; cout << "Reading patterns... ("; while (!is.eof()) { is >> perc; is.getline(buf, BUF_SIZE); if (!is.bad() && sscanf(buf, "%s", buf2) == 1) { r_Minterval area(buf2); IArea* ia = new IArea(area, perc); IAreas += ia; cout << "*"; } else break; } cout << ") -Done- " << endl; is.close(); } void generate_patterns() { srand((unsigned int) time(NULL)); DListIterator it = IAreas.create_iterator(); ofstream os(out_filename); if (!os) { cout << "Could not open " << out_filename << "." << endl; exit(0); } while (it.not_done()) { IArea* ia = *it; ++it; int total = (int)(ia->percent * total_patterns); for (int i=0; iiarea[j].low(); long xmax = ia->iarea[j].high(); long total = xmax-xmin; if (delta[j] > total) delta[j] = total; long dxmin = (rand() % (2*delta[j] + 1)) - delta[j]; long dxmax = (rand() % (2*delta[j] + 1)) - delta[j]; xmin = xmin + dxmin; if (xmin < (*domain)[j].low()) xmin = (*domain)[j].low() + ((*domain)[j].low() - xmin); xmax = xmax + dxmax; if (xmax > (*domain)[j].high()) xmax = (*domain)[j].high() - (xmax - (*domain)[j].high()); if (xmin > xmax) { long temp = xmin; xmin = xmax; xmax = temp; } os << xmin << ":" << xmax; if (j != dim-1) os << ","; } os << "]" << endl; } } delete [] delta; delete domain; } int main(int argc, char** argv) { parse(argc, argv); get_specification(); generate_patterns(); return 0; }