Esempio n. 1
0
/**
 * Principal function. It creates Nodes and Edges to put in the Graph,
 * from the given BBHG
 * @param bhg source BBHG
 */
void BBHGDrawer::make() {
    if(_made) {
        return;
    }
    ASSERT(_bhg);
    ASSERT(_graph);


    // Construct the Graph
    HashTable<void*, display::Node*> map;

    for(BBHG::Iterator bb(_bhg); bb; bb++) {
        display::Node *node = _graph->newNode();
        map.put(*bb, node);
        onNode(*bb, node);
    }

    for(BBHG::Iterator bb(_bhg); bb; bb++) {
        display::Node *node = map.get(*bb);
        for(BBHG::OutIterator succ(bb); succ; succ++) {
            BBHGEdge* edge = succ;
            display::Edge *display_edge;
            display_edge = _graph->newEdge(node,map.get(edge->target()));
            onEdge(edge, display_edge);
        }
    }
    onEnd(_graph);
    _made = true;
}
Esempio n. 2
0
void HashTableTest::testInsert()
{
	std::string s1("str1");
	std::string s2("str2");
	HashTable<std::string, int> hashTable;
	assert (!hashTable.exists(s1));
	hashTable.insert(s1, 13);
	assert (hashTable.exists(s1));
	assert (hashTable.get(s1) == 13);
	int retVal = 0;

	assert (hashTable.get(s1, retVal));
	assert (retVal == 13);
	try
	{
		hashTable.insert(s1, 22);
		failmsg ("duplicate insert must fail");
	}
	catch (Exception&){}
	try
	{
		hashTable.get(s2);
		failmsg ("getting a non inserted item must fail");
	}
	catch (Exception&){}

	assert (!hashTable.exists(s2));
	hashTable.insert(s2, 13);
	assert (hashTable.exists(s2));
}
Esempio n. 3
0
int main(int argc, const char * argv[]) {
    HashTable * ht = new HashTable();
    
    ht->put("one", "1");
    ht->put("two", "2");
    ht->put("three", "3");
    ht->put("four", "4");
    ht->put("five", "5");
    ht->put("six", "6");
    ht->put("seven", "7");
    
    string value = ht->get("three");
    if (!value.empty())
        cout << value << endl;
    value = ht->get("two");
    if (!value.empty())
        cout << value << endl;
    value = ht->get("one");
    if (!value.empty())
        cout << value << endl;
    value = ht->get("zero");
    if (!value.empty())
        cout << value << endl;
    value = ht->get("seven");
    if (!value.empty())
        cout << value << endl;
    
    delete ht;
    
    return 0;
}
Esempio n. 4
0
void HashTableTest::testUpdate()
{
	// add code for second test here
	std::string s1("str1");
	std::string s2("str2");
	HashTable<std::string, int> hashTable;
	hashTable.insert(s1, 13);
	hashTable.update(s1, 14);
	assert (hashTable.exists(s1));
	assert (hashTable.get(s1) == 14);
	int retVal = 0;

	assert (hashTable.get(s1, retVal));
	assert (retVal == 14);

	// updating a non existing item must work too
	hashTable.update(s2, 15);
	assert (hashTable.get(s2) == 15);
}
Esempio n. 5
0
void testHashTable()
{
	HashTable<int> table;
	for (char i = 48; i < 58; i++) {	//ascii 0
		string key(string("test ") + string(&i));
		table.set(key, i);

		int val = table.get(key);
		cout << key << ": " << val << endl;
	}
}
Esempio n. 6
0
int main() {
    HashTable h;
    h.put(10,10);
    h.put(130,130);
    h.put(8,8);
    h.put(128,128);
    h.put(40,40);
    h.put(1,1);
    h.put(0,0);
    h.put(10,20);
    cout << h.get(10) << endl;
    return 0;
}
Esempio n. 7
0
int main(){
  HashTable<int, string> t;
  for (int k=0; k < 100; k++){
    int l = k*42;
  for (int i=l; i < l+42; i++)
    t.insertAt(i, "Foo");
  
  for (int i=l; i < l+42; i +=2)
    t.remove(i);
  }
  for (int i=0; i < 4200; i+=5)
    cout << t.get(i, "None");
  
  cout << "Done!" << endl;
  
}
Esempio n. 8
0
void Inquire(string Licensestr, HashTable<LicenseType, BikePtr>& ht){

    LicenseType License(Licensestr);
    BikePtr* bikeMetaPtr = ht.get(License);
    if( bikeMetaPtr ) {
        BikePtr bike = *bikeMetaPtr;
        xStationType station = bike->Station;
        ClassType Class = bike->Class;
        int mileage = bike->Mileage;
        cout << setw(15) << "License" << setw(15) << "Mileage"<<setw(15) << "Class" << setw(15) << "Station"<<endl;
        cout<<"============================================================"<< endl;
        cout << setw(11) << License << setw(15) << mileage<<setw(15) << classToStr(Class) << setw(15) << stationTypeToString(station) << endl << endl;
    }
    else {
        cout << "Bike " << Licensestr << " does not belong to our company." << endl;
    }
}
Esempio n. 9
0
int Returns(xStationType statName,  LicenseType license, int mile, HashTable<LicenseType, BikePtr>&ht, Graph &stationMap) {
    
    BikePtr* bikeMetaPtr = ht.get(license);
    if( bikeMetaPtr ) {
        BikePtr bike = *bikeMetaPtr;
        //bike->Status=Free;

         vector<int> prev = stationMap.dijkstra(bike->Station);
         forward_list<int> shortest_path = stationMap.getPath(prev, statName);
         int dist=0;
         if( ! shortest_path.empty() ) {

             for(forward_list<int>::iterator it = shortest_path.begin(); it != shortest_path.end();) {
                 int from_tmp = *it;

                 forward_list<int>::iterator it_next = it;
                 it_next++;
                 if( it_next != shortest_path.end() ) {
                    int to_tmp = *(it_next);
                    dist += stationMap.distance(from_tmp, to_tmp);
                 }
                 it = it_next;
            }
         }

        int charge=0;
        int tmp=mile-bike->Mileage;

        if(tmp>dist){
            switch(bike->Class){
                case 0:
                    charge=tmp*40;
                    break;
                case 1:
                    charge=tmp*30;
                    break;
                case 2:
                    charge=tmp*20;
                    break;
                case 3:
                    charge=tmp*25;
                    break;
            }
        }
        else{
            switch(bike->Class){
                case 0:
                    charge=tmp*30;
                    break;
                case 1:
                    charge=tmp*25;
                    break;
                case 2:
                    charge=tmp*15;
                    break;
                case 3:
                    charge=tmp*20;
                    break;
            }
        }


        bike->Mileage=mile;
        int index = Station[bike->Station].HRent.find(bike, &licenseComp);
        Station[bike->Station].HRent.remove(index);
        Station[bike->Station].Nets[bike->Class] += charge;
        
        bike->Status = Free;
        Station[bike->Station].add(bike);
        
        cout<<"Rental charge for this bike is "<<charge<<"."<<endl;
    }
    return 0;
}
Esempio n. 10
0
void LoopReductor::reduce(VirtualCFG *vcfg, CFG *cfg) {

	HashTable<BasicBlock*,BasicBlock*> map;
	map.put(cfg->entry(), vcfg->entry());
	map.put(cfg->exit(),vcfg->exit());

	idx = 1;
	/* duplicate the basic blocks */
	for (CFG::BBIterator bb(cfg); bb; bb++) {
		if (!bb->isEnd()) {
			BasicBlock *vbb = new VirtualBasicBlock(*bb);
			INDEX(vbb) = idx;
			idx++;
			map.put(bb, vbb);
			vcfg->addBB(vbb);
		}
	}
	INDEX(vcfg->exit()) = idx;
	idx++;

	/* connect edges */
	for (CFG::BBIterator bb(cfg); bb; bb++) {
		for (BasicBlock::OutIterator edge(bb); edge; edge++) {
			if (edge->kind() == Edge::CALL) {
				BasicBlock *vsource = map.get(edge->source(), NULL);
				CFG *vcalled = vcfgvec.get(INDEX(edge->calledCFG()));
				ASSERT(vsource && vcalled);
				Edge *vedge = new Edge(vsource, vcalled->entry(), Edge::CALL);
				CALLED_CFG(vedge) = vcalled;

			} else {
				BasicBlock *vsource = map.get(edge->source(), NULL);
				BasicBlock *vtarget = map.get(edge->target(), NULL);
				ASSERT(vsource && vtarget);
				new Edge(vsource, vtarget, edge->kind());
			}
		}
	}


	Vector<BasicBlock*> *ancestors = new Vector<BasicBlock*>();

	for (CFG::BBIterator bb(vcfg); bb; bb++) {
		IN_LOOPS(bb) = new dfa::BitSet(vcfg->countBB());
	}

	/* Do the Depth-First Search, compute the ancestors sets, and mark loop headers */
	depthFirstSearch(vcfg->entry(), ancestors);

	/* Collect all loop headers in a bitset */
/*
	for (CFG::BBIterator bb(vcfg); bb; bb++)
		if (LOOP_HEADER(bb)) {
			realhdr.add(bb->number());
		}
		*/
	/*
	HashTable<int, BasicBlock*> hdrmap;
	Vector<BasicBlock*> dups;
	*/


	bool done = false;
	while (!done) {
		done = true;
		for (CFG::BBIterator bb(vcfg); bb; bb++) {
			Vector<Edge*> toDel;
			BasicBlock *duplicate = NULL;
			for (BasicBlock::InIterator edge(bb); edge; edge++) {

				/* compute loops entered by the edge */
				dfa::BitSet enteredLoops(**IN_LOOPS(bb));
				enteredLoops.remove(**IN_LOOPS(edge->source()));

				/* The edge is a regular entry if it enters one loop, and edge->target() == loop header */
				if (!((enteredLoops.count() == 0) || ((enteredLoops.count() == 1) && (enteredLoops.contains(bb->number()))))) {
					if (!duplicate) {
						duplicate = new VirtualBasicBlock(bb);
						ASSERT(DUPLICATE_OF(bb) == NULL);
						DUPLICATE_OF(bb) = duplicate;
						INDEX(duplicate) = idx;
						idx++;
						vcfg->addBB(duplicate);
						IN_LOOPS(duplicate) = new dfa::BitSet(**IN_LOOPS(edge->source()));
						for (BasicBlock::OutIterator outedge(bb); outedge; outedge++) {
							if (DUPLICATE_OF(outedge->target())) {
								new Edge(duplicate, DUPLICATE_OF(outedge->target()), outedge->kind());
							} else {
								new Edge(duplicate, outedge->target(), outedge->kind());
							}
						}

					}
					done = false;

					new Edge(edge->source(), duplicate, edge->kind());

					toDel.add(edge);
				}
			}
			for (Vector<Edge*>::Iterator edge(toDel); edge; edge++)
				delete *edge;
		}
	}

	delete ancestors;
}
Esempio n. 11
0
int main(int argc, char *argv[])
{
  
  //checks to see correct number of arguments are passed in
  if(argc != 2)
    cerr << "Not correct number of arguments passed in." << endl;
  
  //creates a hash table
  HashTable htable;
  vector<string> nameVector;
  int i, dayNum, monthNum, yearNum;
  string day, month, year;

  ifstream infile(argv[1]);

  if(!infile.is_open())
    cout << "Could not open the file." << endl;
  else
  {
    string line;
    string name;
    int count = 0;

    while(getline(infile, line))
    {
      stringstream instream(line);
      
      getline(instream, name, ',');
      getline(instream, month, '/');
      getline(instream, day, '/');
      getline(instream, year);

      Date d(atoi(month.c_str()), atoi(day.c_str()), atoi(year.c_str()));

      htable.insert(d, name);

    }


  }

  

  string wholeDate;

  //get the initial date from the user
  cout << "Please enter a date (mm/dd/yyyy) or 0 when finished: " ;
  cin >> wholeDate;

  //parse the initial date
  stringstream newinstream(wholeDate);
  getline(newinstream, month, '/');
  getline(newinstream, day, '/');
  getline(newinstream, year);

  dayNum = atoi(day.c_str());
  monthNum = atoi(month.c_str());
  yearNum = atoi(year.c_str());

  while(dayNum != 0 && monthNum != 0 && yearNum != 0)
  {
    Date getDate(monthNum, dayNum, yearNum);
    nameVector = htable.get(getDate);

    if(nameVector.size() == 0)
      cout << "No names found for that date" << endl;
    else
    {
      cout << "Number of names for date: " << month << "/" << day << "/" << year << ": " << nameVector.size()<< endl;

      for(i = 0; i < nameVector.size(); i++)
        cout << nameVector[i] <<  endl;
    }

    //get the next date from the user
    cout << "Enter another date or 0 when finished: " ;
    cin >> wholeDate;

    //parse the next date
    stringstream newinstream(wholeDate);
    getline(newinstream, day, '/');
    getline(newinstream, month, '/');
    getline(newinstream, year);

    dayNum = atoi(day.c_str());
    monthNum = atoi(month.c_str());
    yearNum = atoi(year.c_str());

  }
  
  
  return 0;
}
Esempio n. 12
0
int main(int argc, char** arvg){
    srand(time(NULL));
    vector <int> v;
    BSTree* root = new BSTree();
    HashTable *ht = new HashTable();
    int key, counter = 0;

    initValues(v, *root, *ht);

    cout << "Vector: " << endl;
    sort(v.begin(), v.end());
    printVector(v);

    cout << "Binary Search Tree: " << endl;
    root->print();

    cout << "Hash table: " << endl;
    ht->printHashTable();

    cout << "Insert a key to search for: ";
    cin >> key;

    cout << endl << endl << "-------------Sequential Search-------------"
    << endl << endl;

    sequentialSearch(v, key, counter);
    std::string seq = "Number of iteractions from the Sequential Search: ";
    seq += std::to_string(counter);
    cout << seq << endl;

    cout << endl << endl << "-------------Binary Search-------------"
    << endl << endl;

    counter = 0;
    binarySearch(v, key, counter, 0, size-1);
    std::string bin = "Number of iteractions from the Binary Search: ";
    bin += std::to_string(counter);
    cout << bin << endl;

    cout << endl << endl << "-------------Binary Search Tree-------------"
    << endl << endl;

    counter = 0;
    root->search(key, counter);

    cout << endl << endl << "-------------Hash Table-------------"
    << endl << endl;

    counter = 0;
    ht->get(key, counter);
    std::string hash = "Number of iteractions from the Hash Table: ";
    hash += std::to_string(counter);
    cout << hash << endl;

    cout << endl << endl << "-------------Destroying Structures-------------"
    << endl << endl;

    delete root;
    delete ht;

    getchar();
    return 0;
}
Esempio n. 13
0
/**
 * Find a type by its name.
 * @param name	Type name.
 * @return		Found type or NULL.
 */
AbstractType *AbstractType::getType(CString name) {
	return types.get(name, 0);
}
Esempio n. 14
0
int testHashTable()
{
  HashTable<uint64_t *,uint64_t> *hashTable;
  std::vector<uint64_t> verify;
  hashTable = new HashTable<uint64_t *,uint64_t>(glbTestSize);
  uint64_t *value;
  
  cout << "\nTesting HashTable.\n";
  
  verify.resize(glbTestSize);
  
  for (int ix = 0; ix < glbTestSize; ix++)
  {
    do
    {
      value = new uint64_t(random());
    }
    while (hashTable->get(*value) == NULL);
    
    hashTable->insert(value, *value);
    
    verify[ix] = *value;
  }
  
  for (int ix = 0; ix < glbTestSize; ix++)
  {
    if (*hashTable->get(verify[ix]) != verify[ix])
    {
      hashTable->get(verify[ix]);
      cout << "Index ";
      cout << ix;
      cout << " does not match!\n";
      //return -1;
    }
    
    //if ((ix % 4) == 3) {
    //  hashTable->remove(index);
    //}
  }
  
  for (int ix = 0; ix < glbTestSize; ix++)
  {
    if (*hashTable->get(verify[ix]) != verify[ix])
    {
      cout << "Index ";
      cout << ix;
      cout << " does not match!\n";
      return -1;
    }
    
    hashTable->remove(verify[ix]);
    
    //if ((index % 4) != 3) {
    //  hashTable->remove(index);
    //}
  }
  
  delete hashTable;
  
  cout << "HashTable:Done\n";
  
  return 0;
}
Esempio n. 15
0
void GeneticLabratory::setInitialCraftingValues(TangibleObject* prototype, ManufactureSchematic* manufactureSchematic, int assemblySuccess) {

    if(manufactureSchematic == NULL || manufactureSchematic->getDraftSchematic() == NULL)
        return;
    ManagedReference<DraftSchematic* > draftSchematic = manufactureSchematic->getDraftSchematic();
    CraftingValues* craftingValues = manufactureSchematic->getCraftingValues();
    float value, maxPercentage, currentPercentage, weightedSum;
    String itemName;
    // These 2 values are pretty standard, adding these
    itemName = "xp";
    value = float(draftSchematic->getXpAmount());
    craftingValues->addExperimentalProperty("", itemName, value, value, 0, true, CraftingManager::OVERRIDECOMBINE);
    itemName = "complexity";
    value = manufactureSchematic->getComplexity();
    craftingValues->addExperimentalProperty("", itemName, value, value, 0, true, CraftingManager::OVERRIDECOMBINE);
    float modifier = calculateAssemblyValueModifier(assemblySuccess);
    // Cast component to genetic
    if (!prototype->isComponent())
        return;

    GeneticComponent* genetic = cast<GeneticComponent*>(prototype);
    HashTable<String, ManagedReference<DnaComponent*> > slots;
    for (int i = 0; i < manufactureSchematic->getSlotCount(); ++i) {
        // Dna Component Slots
        Reference<IngredientSlot* > iSlot = manufactureSchematic->getSlot(i);
        ComponentSlot* cSlot = cast<ComponentSlot*>(iSlot.get());
        ManagedReference<TangibleObject*> tano = cSlot->getPrototype();
        ManagedReference<DnaComponent*> component = cast<DnaComponent*>( tano.get());
        slots.put(cSlot->getSlotName(),component);
    }
    // At this point we have all the DNA slots. Update the craftingvalue accordingly
    DnaComponent* phy = slots.get("physique_profile").get();
    DnaComponent* pro = slots.get("prowess_profile").get();
    DnaComponent* men = slots.get("mental_profile").get();
    DnaComponent* psy = slots.get("psychological_profile").get();
    DnaComponent* agr = slots.get("aggression_profile").get();

    uint32 harMax, fortMax, endMax,intMax, dexMax,cleMax,depMax,couMax,fieMax,powMax;

    fortMax = applyFormula(phy->getForititude(),pro->getForititude(),men->getForititude(),psy->getForititude(),agr->getForititude(),PHYSIQUE);
    harMax = applyFormula(phy->getHardiness(),pro->getHardiness(),men->getHardiness(),psy->getHardiness(),agr->getHardiness(),PHYSIQUE);
    dexMax = applyFormula(phy->getDexterity(),pro->getDexterity(),men->getDexterity(),psy->getDexterity(),agr->getDexterity(),PROWESS);
    endMax = applyFormula(phy->getEndurance(),pro->getEndurance(),men->getEndurance(),psy->getEndurance(),agr->getEndurance(),PROWESS);
    intMax = applyFormula(phy->getIntellect(),pro->getIntellect(),men->getIntellect(),psy->getIntellect(),agr->getIntellect(),MENTAL);
    cleMax = applyFormula(phy->getCleverness(),pro->getCleverness(),men->getCleverness(),psy->getCleverness(),agr->getCleverness(),MENTAL);
    depMax = applyFormula(phy->getDependency(),pro->getDependency(),men->getDependency(),psy->getDependency(),agr->getDependency(),PHYSCHOLOGICAL);
    couMax = applyFormula(phy->getCourage(),pro->getCourage(),men->getCourage(),psy->getCourage(),agr->getCourage(),PHYSCHOLOGICAL);
    fieMax = applyFormula(phy->getFierceness(),pro->getFierceness(),men->getFierceness(),psy->getFierceness(),agr->getFierceness(),AGRESSION);
    powMax = applyFormula(phy->getPower(),pro->getPower(),men->getPower(),psy->getPower(),agr->getPower(),AGRESSION);

    uint32 fortMin,endMin,harMin,intMin,dexMin,cleMin,depMin,couMin,fieMin,powMin;
    fortMin = calcMin(fortMax);
    harMin = calcMin(harMax);
    dexMin = calcMin(dexMax);
    endMin = calcMin(endMax);
    intMin = calcMin(intMax);
    cleMin = calcMin(cleMax);
    depMin = calcMin(depMax);
    couMin = calcMin(couMax);
    fieMin = calcMin(fieMax);
    powMin = calcMin(powMax);

    float blast, energy, kinetic,heat,cold,electric,acid,stun,saber;
    blast = applyFormula(phy->getBlast(),pro->getBlast(),men->getBlast(),psy->getBlast(),agr->getBlast(),PHYSIQUE);
    kinetic = applyFormula(phy->getKinetic(),pro->getKinetic(),men->getKinetic(),psy->getKinetic(),agr->getKinetic(),PHYSIQUE);
    energy = applyFormula(phy->getEnergy(),pro->getEnergy(),men->getEnergy(),psy->getEnergy(),agr->getEnergy(),PHYSIQUE);
    heat = applyFormula(phy->getHeat(),pro->getHeat(),men->getHeat(),psy->getHeat(),agr->getHeat(),PHYSIQUE);
    cold = applyFormula(phy->getCold(),pro->getCold(),men->getCold(),psy->getCold(),agr->getCold(),PHYSIQUE);
    electric = applyFormula(phy->getElectric(),pro->getElectric(),men->getElectric(),psy->getElectric(),agr->getElectric(),PHYSIQUE);
    acid = applyFormula(phy->getAcid(),pro->getAcid(),men->getAcid(),psy->getAcid(),agr->getAcid(),PHYSIQUE);
    stun = applyFormula(phy->getStun(),pro->getStun(),men->getStun(),psy->getStun(),agr->getStun(),PHYSIQUE);
    saber = applyFormula(phy->getSaber(),pro->getSaber(),men->getSaber(),psy->getSaber(),agr->getSaber(),PHYSIQUE);

    craftingValues->addExperimentalProperty("expPhysiqueProfile","fortitude",fortMin,fortMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expPhysiqueProfile","hardiness",harMin,harMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expProwessProfile","dexterity",dexMin,dexMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expProwessProfile","endurance",endMin,endMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expMentalProfile","intellect",intMin,intMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expMentalProfile","cleverness",cleMin,cleMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expPsychologicalProfile","dependability",depMin,depMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expPsychologicalProfile","courage",couMin,couMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expAggressionProfile","fierceness",fieMin,fieMax,0,false,CraftingManager::LINEARCOMBINE);
    craftingValues->addExperimentalProperty("expAggressionProfile","power",powMin,powMax,0,false,CraftingManager::LINEARCOMBINE);

    craftingValues->addExperimentalProperty("","dna_comp_armor_kinetic",calcResistMin(kinetic,modifier),kinetic,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_blast",calcResistMin(blast,modifier),blast,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_energy",calcResistMin(energy,modifier),energy,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_heat",calcResistMin(heat,modifier),heat,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_cold",calcResistMin(cold,modifier),cold,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_electric",calcResistMin(electric,modifier),electric,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_acid",calcResistMin(acid,modifier),acid,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_stun",calcResistMin(stun,modifier),stun,0,true,CraftingManager::OVERRIDECOMBINE);
    craftingValues->addExperimentalProperty("","dna_comp_armor_saber",calcResistMin(saber,modifier),saber,0,true,CraftingManager::OVERRIDECOMBINE);

    craftingValues->setMaxPercentage("dna_comp_armor_kinetic",kinetic/100);
    craftingValues->setMaxPercentage("dna_comp_armor_blast",blast/100);
    craftingValues->setMaxPercentage("dna_comp_armor_energy",energy/100);
    craftingValues->setMaxPercentage("dna_comp_armor_heat",heat/100);
    craftingValues->setMaxPercentage("dna_comp_armor_cold",cold/100);
    craftingValues->setMaxPercentage("dna_comp_armor_electric",electric/100);
    craftingValues->setMaxPercentage("dna_comp_armor_acid",acid/100);
    craftingValues->setMaxPercentage("dna_comp_armor_stun",stun/100);
    craftingValues->setMaxPercentage("dna_comp_armor_saber",saber/100);

    if (kinetic > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_kinetic",calcResistMin(kinetic,modifier)/kinetic);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_kinetic",kinetic/100);
    if (blast > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_blast",calcResistMin(blast,modifier)/blast);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_blast",blast/100);
    if (energy > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_energy",calcResistMin(energy,modifier)/energy);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_energy",energy/100);
    if (heat > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_heat",calcResistMin(heat,modifier)/heat);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_heat",heat/100);
    if (cold > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_cold",calcResistMin(cold,modifier)/cold);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_cold",cold/100);
    if (electric > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_electric",calcResistMin(electric,modifier)/electric);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_electric",electric/100);
    if (acid > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_acid",calcResistMin(acid,modifier)/acid);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_acid",acid/100);
    if (stun > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_stun",calcResistMin(stun,modifier)/stun);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_stun",stun/100);
    if (saber > 0)
        craftingValues->setCurrentPercentage("dna_comp_armor_saber",calcResistMin(saber,modifier)/saber);
    else
        craftingValues->setCurrentPercentage("dna_comp_armor_saber",saber/100);


    // Calc the max Percentage, vs Min Percentage
    craftingValues->setMaxPercentage("fortitude",calcMaxPercentage(fortMax));
    craftingValues->setCurrentPercentage("fortitude", getAssemblyPercentage(fortMin) * modifier);

    craftingValues->setMaxPercentage("hardiness",calcMaxPercentage(harMax));
    craftingValues->setCurrentPercentage("hardiness", getAssemblyPercentage(harMin) * modifier);

    craftingValues->setMaxPercentage("dexterity",calcMaxPercentage(dexMax));
    craftingValues->setCurrentPercentage("dexterity", getAssemblyPercentage(dexMin) * modifier);

    craftingValues->setMaxPercentage("endurance",calcMaxPercentage(endMax));
    craftingValues->setCurrentPercentage("endurance", getAssemblyPercentage(endMin) * modifier);

    craftingValues->setMaxPercentage("intellect",calcMaxPercentage(intMax));
    craftingValues->setCurrentPercentage("intellect", getAssemblyPercentage(intMin) * modifier);

    craftingValues->setMaxPercentage("cleverness",calcMaxPercentage(cleMax));
    craftingValues->setCurrentPercentage("cleverness", getAssemblyPercentage(cleMin) * modifier);

    craftingValues->setMaxPercentage("dependability",calcMaxPercentage(depMax));
    craftingValues->setCurrentPercentage("dependability", getAssemblyPercentage(depMin) * modifier);

    craftingValues->setMaxPercentage("courage",calcMaxPercentage(couMax));
    craftingValues->setCurrentPercentage("courage",getAssemblyPercentage(couMin) * modifier);

    craftingValues->setMaxPercentage("fierceness",calcMaxPercentage(fieMax));
    craftingValues->setCurrentPercentage("fierceness",getAssemblyPercentage(fieMin) * modifier);

    craftingValues->setMaxPercentage("power",calcMaxPercentage(powMax));
    craftingValues->setCurrentPercentage("power", getAssemblyPercentage(powMin) * modifier);

    // Figure out the min percentage of the stats

    int quality = (phy->getQuality() + pro->getQuality() + men->getQuality() + psy->getQuality() + agr->getQuality()) / 5;
    bool ranged = false;
    int odds = 0;
    float menQual = 7 - men->getQuality();
    float psyQual = 7 - psy->getQuality();
    if (men->isRanged() || psy->isRanged()) {
        int chance = System::random(100 - (assemblySuccess * 10)); // so amazing success 100, critical falure is 20
        // did you roll exceed (7 - Quality) * 10 (VHQ is 0) so always works
        if (chance > (menQual * 10) || chance > (psyQual * 10))
            ranged = true;
    }
    odds = men->getQuality() * 100;
    // check for specials here, then we have base assemble work completed.
    // update crafting values, and/or experimentRow should handle resist calc changes. update crafting values should determine armor setup
    String sp1 = pickSpecialAttack(agr->getSpecialAttackOne(),psy->getSpecialAttackOne(),phy->getSpecialAttackOne(),men->getSpecialAttackOne(),pro->getSpecialAttackOne(),odds);
    String sp2 = pickSpecialAttack(psy->getSpecialAttackTwo(),pro->getSpecialAttackTwo(),agr->getSpecialAttackTwo(),men->getSpecialAttackTwo(),phy->getSpecialAttackTwo(),odds);
    genetic->setSpecialAttackOne(sp1);
    genetic->setSpecialAttackTwo(sp2);
    genetic->setRanged(ranged);
    genetic->setQuality(quality);
    // determine avg sample levels to choose a level of this template for output generation
    int level = (phy->getLevel() + pro->getLevel() + men->getLevel() + psy->getLevel() + agr->getLevel()) / 5;
    genetic->setLevel(level);
    craftingValues->recalculateValues(true);
}
void GeneticLabratory::setInitialCraftingValues(TangibleObject* prototype, ManufactureSchematic* manufactureSchematic, int assemblySuccess) {

	if(manufactureSchematic == NULL || manufactureSchematic->getDraftSchematic() == NULL)
		return;
	ManagedReference<DraftSchematic* > draftSchematic = manufactureSchematic->getDraftSchematic();
	CraftingValues* craftingValues = manufactureSchematic->getCraftingValues();
	float value, maxPercentage, currentPercentage, weightedSum;
	String itemName;
	// These 2 values are pretty standard, adding these
	itemName = "xp";
	value = float(draftSchematic->getXpAmount());
	craftingValues->addExperimentalProperty("", itemName, value, value, 0, true, CraftingManager::OVERRIDECOMBINE);
	itemName = "complexity";
	value = manufactureSchematic->getComplexity();
	craftingValues->addExperimentalProperty("", itemName, value, value, 0, true, CraftingManager::OVERRIDECOMBINE);
	float modifier = calculateAssemblyValueModifier(assemblySuccess);
	// Cast component to genetic
	if (!prototype->isComponent())
		return;

	GeneticComponent* genetic = cast<GeneticComponent*>(prototype);
	HashTable<String, ManagedReference<DnaComponent*> > slots;
	for (int i = 0; i < manufactureSchematic->getSlotCount(); ++i) {
		// Dna Component Slots
		Reference<IngredientSlot* > iSlot = manufactureSchematic->getSlot(i);
		ComponentSlot* cSlot = cast<ComponentSlot*>(iSlot.get());
		ManagedReference<TangibleObject*> tano = cSlot->getPrototype();
		ManagedReference<DnaComponent*> component = cast<DnaComponent*>( tano.get());
		slots.put(cSlot->getSlotName(),component);
	}
	// At this point we have all the DNA slots. Update the craftingvalue accordingly
	DnaComponent* phy = slots.get("physique_profile").get();
	DnaComponent* pro = slots.get("prowess_profile").get();
	DnaComponent* men = slots.get("mental_profile").get();
	DnaComponent* psy = slots.get("psychological_profile").get();
	DnaComponent* agr = slots.get("aggression_profile").get();
	// REVAMP FROM HERE DOWN.
	// STEP 1. Determine Attributes
	uint32 harMax, fortMax, endMax,intMax, dexMax,cleMax,depMax,couMax,fieMax,powMax;
	// Calculate the max values i.e. the weighter resource avergae.
	fortMax = Genetics::physiqueFormula(phy->getForititude(),pro->getForititude(),men->getForititude(),psy->getForititude(),agr->getForititude());
	harMax = Genetics::physiqueFormula(phy->getHardiness(),pro->getHardiness(),men->getHardiness(),psy->getHardiness(),agr->getHardiness());
	dexMax = Genetics::prowessFormula(phy->getDexterity(),pro->getDexterity(),men->getDexterity(),psy->getDexterity(),agr->getDexterity());
	endMax = Genetics::prowessFormula(phy->getEndurance(),pro->getEndurance(),men->getEndurance(),psy->getEndurance(),agr->getEndurance());
	intMax = Genetics::mentalFormula(phy->getIntellect(),pro->getIntellect(),men->getIntellect(),psy->getIntellect(),agr->getIntellect());
	cleMax = Genetics::mentalFormula(phy->getCleverness(),pro->getCleverness(),men->getCleverness(),psy->getCleverness(),agr->getCleverness());
	depMax = Genetics::physchologicalFormula(phy->getDependency(),pro->getDependency(),men->getDependency(),psy->getDependency(),agr->getDependency());
	couMax = Genetics::physchologicalFormula(phy->getCourage(),pro->getCourage(),men->getCourage(),psy->getCourage(),agr->getCourage());
	fieMax = Genetics::aggressionFormula(phy->getFierceness(),pro->getFierceness(),men->getFierceness(),psy->getFierceness(),agr->getFierceness());
	powMax = Genetics::aggressionFormula(phy->getPower(),pro->getPower(),men->getPower(),psy->getPower(),agr->getPower());
	// acknowledge any specials found in the experimentation line. this means specials will not modify later by experimentaiton as its an overlay value.
	bool spBlast = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::BLAST);
	bool spKinetic = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::KINETIC);
	bool spEnergy = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::ENERGY);
	bool spHeat = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::HEAT);
	bool spCold = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::COLD);
	bool spElectric = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::ELECTRICITY);
	bool spAcid = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::ACID);
	bool spStun = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::STUN);
	bool spSaber = Genetics::hasASpecial(phy,pro,men,psy,agr,WeaponObject::LIGHTSABER);
	// Calculate resists
	// 1 percent: (1000 - 0) / 100.0f;
	float blastMax, energyMax, kineticMax,heatMax,coldMax,electricMax,acidMax,stunMax,saberMax;
	blastMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::BLAST,100.0f);
	kineticMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::KINETIC,60.0f);
	energyMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::ENERGY,60.0f);
	heatMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::HEAT,100.0f);
	coldMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::COLD,100.0f);
	electricMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::ELECTRICITY,100.0f);
	acidMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::ACID,100.0f);
	stunMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::STUN,100.0f);
	saberMax = Genetics::resistanceFormula(phy,pro,men,psy,agr,WeaponObject::LIGHTSABER,100.0f);
	// lets clear the special bit if it moved to effective range.
	if(saberMax == 0) {
		spSaber = false;
		saberMax = 100;
	}
	if (blastMax == 0) {
		spBlast = false;
		blastMax = 100;
	}
	if (kineticMax == 0) {
		spKinetic = false;
		kineticMax = 60;
	}
	if (energyMax == 0) {
		spEnergy = false;
		energyMax = 60;
	}
	if (heatMax == 0) {
		spHeat = false;
		heatMax = 100;
	}
	if (coldMax == 0) {
		spCold = false;
		coldMax = 100;
	}
	if (electricMax == 0) {
		spElectric = false;
		electricMax = 100;
	}
	if(acidMax == 0) {
		spAcid = false;
		acidMax = 100;
	}
	if(stunMax == 0) {
		spStun = false;
		stunMax = 100;
	}

	// Step 2. At this point we know the max values for all stats and we have calculated any armor specials needed
	// So now we need to setup the min and initial values of stats and define the experimental attributes. // Ranges are 0 to 100 for any one of these
	// set current value to be 70% less than max calculated as the experimentation range. i.e.
	craftingValues->addExperimentalProperty("expPhysiqueProfile","fortitude",0,fortMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expPhysiqueProfile","hardiness",0,harMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expProwessProfile","dexterity",0,dexMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expProwessProfile","endurance",0,endMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expMentalProfile","intellect",0,intMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expMentalProfile","cleverness",0,cleMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expPsychologicalProfile","dependability",0,depMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expPsychologicalProfile","courage",0,couMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expAggressionProfile","fierceness",0,fieMax,0,false,CraftingManager::LINEARCOMBINE);
	craftingValues->addExperimentalProperty("expAggressionProfile","power",0,powMax,0,false,CraftingManager::LINEARCOMBINE);
	String title;
	int armorBase = 0;
	int effectiveness = 0;
	for(int i=0;i<craftingValues->getExperimentalPropertySubtitleSize();i++) {
		title = craftingValues->getExperimentalPropertySubtitle(i);
		if (craftingValues->isHidden(title))
			continue;
		// We need to accoutn for assembly percentage. do some swapping around as well.
		float maxValue = craftingValues->getMaxValue(title);
		float initialValue = Genetics::initialValue(craftingValues->getMaxValue(title));
		// determine max percentage
		craftingValues->setMaxPercentage(title, maxValue/1000.0f);
		craftingValues->setMaxValue(title,1000);
		// using assembly to accoutn for a 1 +% increase
		currentPercentage = getAssemblyPercentage(initialValue) * modifier;
		//craftingValues->setMaxPercentage(title, maxPercentage);
		craftingValues->setCurrentPercentage(title, currentPercentage);
		if (title == "fortitude") {
			armorBase = craftingValues->getCurrentValue(title);
		}
	}
	int armorValue = armorBase/500;
	effectiveness = (int)(((armorBase - (armorValue * 500)) / 50) * 5);
	// Store off armor data
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_kinetic",spKinetic ? kineticMax : kineticMax < 0 ? -1 : effectiveness,kineticMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_blast",spBlast ? blastMax : blastMax < 0 ? -1 : effectiveness, blastMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_energy",spEnergy ? energyMax : energyMax < 0 ? -1 : effectiveness, energyMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_heat",spHeat ? heatMax : heatMax < 0 ? -1 :  effectiveness ,heatMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_cold",spCold ? coldMax : coldMax < 0 ? -1 : effectiveness ,coldMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_electric",spElectric ? electricMax : electricMax < 0 ? -1 : effectiveness ,electricMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_acid",spAcid ? acidMax : acidMax < 0 ? -1 : effectiveness ,acidMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_stun",spStun ? stunMax : stunMax < 0 ? -1 : effectiveness ,stunMax,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("resists","dna_comp_armor_saber",spSaber ? saberMax : saberMax < 0 ? -1 : effectiveness ,saberMax,0,true,CraftingManager::OVERRIDECOMBINE);
	// Store off special information
	craftingValues->addExperimentalProperty("specials","kineticeffectiveness",spKinetic ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","blasteffectiveness",spBlast ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","energyeffectiveness",spEnergy ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","heateffectiveness",spHeat ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","coldeffectiveness",spCold ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","electricityeffectiveness",spElectric ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","acideffectiveness",spAcid ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","stuneffectiveness",spStun ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	craftingValues->addExperimentalProperty("specials","lightsabereffectiveness",spSaber ? 1: 0,1,0,true,CraftingManager::OVERRIDECOMBINE);
	int quality = ( ((float)phy->getQuality() * 0.2)+ ((float)pro->getQuality()*0.2) + ((float)men->getQuality()*0.2) + ((float)psy->getQuality()*0.2) + ((float)agr->getQuality()*0.2));
	bool ranged = false;
	int odds = 0;
	float menQual = men->getQuality() - 1;
	float psyQual = psy->getQuality() - 1;
	if (men->isRanged() || psy->isRanged()) {
		int chance = System::random(100-(assemblySuccess * 10)); // so amazing success 100, critical falure is 20
		// did you roll exceed (7 - Quality) * 10 (VHQ is 0) so always works
		if (chance >= (menQual * 10) || chance >= (psyQual * 10))
			ranged = true;
	}
	odds = quality * 100;
	// check for specials here, then we have base assemble work completed.
	// update crafting values, and/or experimentRow should handle resist calc changes. update crafting values should determine armor setup
	String sp1 = pickSpecialAttack(agr->getSpecialAttackOne(),psy->getSpecialAttackOne(),phy->getSpecialAttackOne(),men->getSpecialAttackOne(),pro->getSpecialAttackOne(),odds,"defaultattack");
	String sp2 = pickSpecialAttack(psy->getSpecialAttackTwo(),pro->getSpecialAttackTwo(),agr->getSpecialAttackTwo(),men->getSpecialAttackTwo(),phy->getSpecialAttackTwo(),odds,sp1);
	genetic->setSpecialAttackOne(sp1);
	genetic->setSpecialAttackTwo(sp2);
	genetic->setRanged(ranged);
	genetic->setQuality(quality);
	// determine avg sample levels to choose a level of this template for output generation
	int level = Genetics::physchologicalFormula(phy->getLevel(),pro->getLevel(),men->getLevel(), psy->getLevel() ,agr->getLevel());
	genetic->setLevel(level);
	craftingValues->recalculateValues(true);
}